2012-06-05 60 views
1

我有一個基於傳遞給進程的參數創建多個線程的進程。動態創建線程並傳遞一個整數

producer_threads[num_threads]; 
for (id = 0; id < num_threads; id++) 
{ 
    printf("%d\n", id); 
    pthread_create(&producer_threads[id], NULL, &produce, (void *) &id); 
} 

每個線程進入一個產生函數並存儲該ID作爲然而我接收的輸出如圖

0 
1 
Thread <n> started to produce 
Thread <n> started to produce 

和n是隨機地要麼0的局部變量

void* produce (void* args) 
{ 
    int my_id = * (int*) args; 
    printf("Thread %d started to produce\n", my_id); 
} 

,1或2.我不確定是什麼導致了問題,除非是因爲全局變量在被本地分配之前正在更新。或者因爲「局部變量」在線程之間共享。

回答

3

問題是,您正在向每個線程傳遞指向相同變量的指針。這產生了競爭條件,由此每個線程所看到的變量的值取決於確切的時間。

如果您要通過值而不是指針傳遞線程參數,這將解決該問題。

1

該整數需要是一個alloc'd變量而不是一個堆棧變量。由於您將指針傳遞給堆棧中的內存位置,因此結果將取決於時間(即競爭條件)。您需要將不同的變量傳遞給每個pthread_create調用。

相關問題