2013-12-13 72 views
0

我在理解爲什麼此代碼導致競態條件時遇到了一些麻煩。正如我所看到的,只要線程在foo函數中開始,就會用sem_wait阻塞另一個線程,然後在寫入myid之後釋放該塊。但是,我不斷得到Thread 2 Thread 2的輸出。我不明白這是如何發生的,因爲這些塊在寫周圍。有人可以幫我理順這個嗎?信號量(互斥量)示例,競賽條件

非常感謝。

sem_t s; /* semaphore s */ 

void *foo(void *vargp) 
{ 
    int myid; 
    sem_wait(&s); 
    myid = *((int *)vargp); 
    sem_post(&s); 
    printf("Thread %d\n", myid); 
} 

int main() { 
    pthread_t tid[2]; 
    int i; 
    sem_init(&s, 0, 1); 
    for (i = 0; i < 2; i++) 
      pthread_create(&tid[i], 0, foo, &i); 
    pthread_join(tid[0], 0); 
    pthread_join(tid[1], 0); 
} 

回答

1

您的兩個工作線程彼此沒有競爭條件,但每個線程都與主線程有競爭條件。工作中的myid = *((int *)vargp);可以與主線程中的i++同時發生。

這是讀/寫衝突,因此未定義行爲,但Thread 2 Thread 2結果似乎最有可能:在新線程開始運行之前,主線程將增加i2pthread_create只創建「就緒」線程,不需要安排它立即運行。

+0

真棒回覆,謝謝。 – A4Treok