爲什麼下面的代碼有競爭條件?爲什麼以下代碼中的競態條件爲
static int i=0;
void some_fun()
{
++i;
if(2==i)
{
printf("some message");
}
}
爲什麼下面的代碼有競爭條件?爲什麼以下代碼中的競態條件爲
static int i=0;
void some_fun()
{
++i;
if(2==i)
{
printf("some message");
}
}
假設這是從多個線程,靜態變量我需要被保護的調用。 這可以使用前面提到的鎖來完成,或者在這種情況下使用更高效的原子增量操作。 如果您使用的是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()函數將第二個參數去第一和返回的總和。所有這些都是作爲一個原子操作。這比抓取和釋放鎖效率更高
假設這個功能是從多個線程調用時,它有一個爭用條件,因爲變量i
具有靜態存儲持續時間,它是所有線程之間共享,這樣的多個線程可以比賽在它們之間來修改該變量。
問題是多個線程之間共享一個相同的變量,而不像本地/自動變量是每個線程一個變量。
如果你想避免競爭條件,你需要通過使用同步結構來同步對這個共享變量的訪問,這裏最簡單和最相關的就是一個互斥體。
Race condition
發生在多個線程或進程同時訪問共享資源時。
而在你的代碼中,共享資源是我變量。通常,我們將其稱爲critical section
。
所以,如果這段代碼是同時被多個線程或進程訪問並修改它的。例如,它們會增加一個,並減少它。所以,數據將不一致。
希望這有助於:)
我覺得比賽你說的是關於打印消息。不是嗎?
好吧。
也許有人說,如果兩個線程同時調用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");
}
}
沒有給出代碼中的競爭條件。它不是多線程的開始。 – 2013-03-13 06:23:28
粘貼代碼,您可以在其中調用some_fun()方法 – Jacek 2013-03-13 06:26:02