2013-03-13 58 views
-5

爲什麼下面的代碼有競爭條件?爲什麼以下代碼中的競態條件爲

static int i=0; 
void some_fun() 
{ 
    ++i; 
    if(2==i) 
    { 
    printf("some message"); 
    } 
} 
+0

沒有給出代碼中的競爭條件。它不是多線程的開始。 – 2013-03-13 06:23:28

+0

粘貼代碼,您可以在其中調用some_fun()方法 – Jacek 2013-03-13 06:26:02

回答

0

假設這是從多個線程,靜態變量我需要被保護的調用。 這可以使用前面提到的鎖來完成,或者在這種情況下使用更高效的原子增量操作。 如果您使用的是gcc編譯器會是這個樣子:

static int i=0; 
void some_fun() 
{ 
    int local_i = __sync_add_and_fetch(&i, 1); 
    if(2==local_i) 
    { 
    printf("some message"); 
    } 
} 

的__sync_add_and_fetch()函數將第二個參數去第一和返回的總和。所有這些都是作爲一個原子操作。這比抓取和釋放鎖效率更高

1

假設這個功能是從多個線程調用時,它有一個爭用條件,因爲變量i具有靜態存儲持續時間,它是所有線程之間共享,這樣的多個線程可以比賽在它們之間來修改該變量。

問題是多個線程之間共享一個相同的變量,而不像本地/自動變量是每個線程一個變量。

如果你想避免競爭條件,你需要通過使用同步結構來同步對這個共享變量的訪問,這裏最簡單和最相關的就是一個互斥體。

0

Race condition發生在多個線程或進程同時訪問共享資源時。

而在你的代碼中,共享資源是我變量。通常,我們將其稱爲critical section

所以,如果這段代碼是同時被多個線程或進程訪問並修改它的。例如,它們會增加一個,並減少它。所以,數據將不一致。

希望這有助於:)

0

我覺得比賽你說的是關於打印消息。不是嗎?

好吧。

也許有人說,如果兩個線程同時調用some_fun,則只會打印一條消息。

但是,在特殊情況下,您將看到該消息兩次。

void some_fun() 
{ 
    ++i; 
    // <- Assume, The value of i is 2, and program counter of both threads are here 
    if(2==i) 
    { 
    printf("some message"); 
    } 
} 

現在,想想線程#1檢查i==2並打印消息。而CPU的控制給了線程#2,然後該線程檢查i==2並再次打印該消息。

有許多解決方案,以鎖定和同步這個程序如互斥實現以下目標:

void some_fun() 
{ 
    if(atomic_increment_and_test(i, 2)) 
    { 
    printf("some message"); 
    } 
} 
相關問題