2015-07-06 26 views
0

我從回調函數獲取數據,例如從回調線程安全執行檢索信息

static char *buf; 

int cb(char *c) { 
    // append to global var buf 
    append(buf, c); 
    return 0; 
} 

int foo() { 
    ... 
    bar(cb); // calls cb 
    ... 
} 

。顯然我附上每個調用回調到一個全局變量(buf),因爲我無法通過任何在其他時間的信息。現在的問題是,我需要這個線程安全與POSIX線程。我如何安全地檢索信息?注意:我無法更改cb的類型,它必須是int (*cb)(char *c)

+0

你想「安全地檢索」什麼「信息」?是不是鎖定附加(buf,c);'你需要什麼?我很困惑。 –

+0

@意義問題不會有多個線程全部覆蓋'buf',鎖只能防止它同時發生?顯然,這實際上並不是真正的代碼,但基本上可以從'c'中檢索信息。'cb' – carloabelli

+0

是的,所有線程都會覆蓋'buf'。我現在明白你想要的更好;看看[這裏](http://stackoverflow.com/q/4118943/1971013)。對你的設計給予更廣泛的看法是很好的,而不是放大似乎是問題的東西;可能有不同的方法。 –

回答

1

創建一個管理緩衝區的C模塊;每個線程一個。這樣你就可以擺脫全局變量。

在本模塊中,您需要一個將線程ID唯一映射到其緩衝區的數據結構。你可以使用一個哈希表。 (但是,如果您的平臺的線程ID爲0,1,2,3,...,您可以使用以線程ID作爲索引的動態[重新]分配的數組;當然,如果您的應用程序不啓動大量的)

然後,您需要一個像char* getBuffer()這樣的函數來執行查找。當getBuffer()返回NULL時,您可以調用createBuffer()。你需要邏輯清理緩衝區,...;你會明白的。

確保修改此內部數據結構的函數是線程安全的。