2012-11-18 102 views
1

我需要調用返回唯一ID的功能,互斥與並行線程

int getid() 
{ 
static id=0; 
id++; 
return id; 

} 

多個線程需要調用這個函數,我的問題是我不知道,我需要鎖定互斥,

我需要之前,並呼籲像下面

pthread_mutex_lock(&id); 
    int id = getid() 
    pthread_mutex_unlock(&id); 

有人可以幫助我與請功能後鎖定?

回答

3

只要它在訪問共享狀態之前鎖定它的位置並不重要。如果互斥鎖在函數內部,它將不太容易出錯。最小的東西像這樣的工作:

int getid() 
{ 
static int id=0; 

pthread_mutex_lock(&mutex); 
int newId = ++id; 
pthread_mutex_unlock(&mutex); 

return newId; 
} 

周圍有靜態變量線程安全,你可能要考慮的初始化一些問題。

+0

我正是這樣做了,我在想是返回newid的,我的意思是這樣的,當函數被調用然後到達返回時,那麼它被再次調用,會影響第一次返回嗎? – user1832809

+0

由於newId不是一個靜態變量,它將位於調用線程的堆棧中。每個線程都有獨立的堆棧,因此它們不會互相干擾。 – Bovinedragon

+0

謝謝,這樣可以使id成爲一個全局變量,在這種情況下,我將不會遇到線程中的靜態不安全問題? – user1832809

2

對於一個整數,你並不需要一個完整的互斥體,atomic increment就足夠了:

int getid() { 
    static int id = 0; 
    return __sync_fetch_and_add(&id, 1); 
}