2012-03-30 36 views
-1

我想用posix線程寫一些代碼,但我從第一步卡住,說實話我不明白爲什麼。我知道我的問題可能與某種同步有關,但我無法弄清楚。動態pthread產卵同步所需(???)

我在主要是以下幾點:

while(1){ 
    int x = getX(); 
    pthread_t t; 
    printf("Main: %d\n",x); 
    pthread_create(&t, NULL, process_x, &x); 
} 

當我嘗試從主,也是process_x功能我得到的是這樣的打印x值:

主:1

主:2

主:3

主營:4

主營:5

Process_x:5

我怎麼會錯過嗎?

----編輯-----

好吧,也許我需要提供一些更多的信息。 getX函數接收來自套接字的數據並返回一個標識符,而對於我們現在的需要,process_x只是輸出它接收到的參數。

+1

你對這個問題和你的代碼非常熟悉,但我們不是。請給我更多的解釋併發布代碼?應該發生什麼? – gbulmer 2012-03-30 09:40:09

+0

你的'Main:%d'打印在哪裏? – 2012-03-30 09:44:11

+0

所以我認爲印刷的東西是不對的。哪裏不對?你期望它打印什麼? – ArjunShankar 2012-03-30 09:48:24

回答

0

顯然使用malloc不工作,因爲它集合X爲0,這樣的過程總是讀爲0。但是由於每個人的想法,我終於做到了工作使用條件變量,現在一切正常。這是代碼。

int main{ 
    pthread_t t; 
    int x; 
    while(1){ 
    pthread_mutex_lock(&receive); 
    x = getX(); 
    printf("Main: %d\n",x); 
    pthread_create(&t, NULL, process_x, &x); 
    pthread_cond_wait(&goOn, &receive); 
    pthread_mutex_unlock(&receive); 
    } 
} 

void *process_x(void* arg){ 
    pthread_mutex_lock(&receive); 
    int x = *(int *) arg; 
    pthread_cond_signal(&goOn); 
    pthread_mutex_unlock(&receive); 
} 
0

一旦創建線程,將不會立即執行線程使用致電pthread_create的電話。調度程序可以決定保持隊列。在此期間,您的while循環已運行5次,並且x的值也可能已更改爲5.現在,當您的線程被最終計劃時,它(它們)只會看到您的最新值x,因此會打印(s)only 5.

我強烈懷疑Process_x只打印過一次?

沒有默認的方式來獲取以任何特定順序執行的pthread。你需要使用像信號量這樣的同步技術。此外,如果你想看到Process_x打印所有你的價值觀,轉換x到一個數組,並通過x[i]作爲參數傳遞給pthread_create

+0

我的問題實際上不是以正確的順序打印消息。我知道爲了做到這一點,我需要在線程之間使用互斥體和信號。我只是想所有的線程來處理 – gkaran89 2012-03-30 10:04:57

+0

如果你改變'x'到一個數組,我建議,所有線程應執行並顯示正確的價值觀,雖然不是爲了,因爲你已經知道 – 2012-03-30 10:07:09

+0

@ gkaran89你傳遞一個指針到X到你的線程。你的循環的下一次迭代改變了X,並且發生了不好的事情。您可以每次動態分配X,因此每個線程都可以獲得其獨特的價值 – nos 2012-03-30 10:11:54

1

你需要考慮你的x地址傳遞給一個線程,然後無需等待線程要完成打印,請修改它的值。顯然,這意味着如果在線程打印之前有一些迭代已經結束,那麼值就會改變。

兩種方法解決此問題:

1)使用pthread_join,等待線程完成。這是根本無用的。因爲那麼產生新線程有什麼意義呢?

OR

2)分配一個新的地址爲每個線程,並讓該線程釋放它在完成打印後。

malloc一個新的整數,分配x到整數,新malloc d整數傳遞給線程,讓線程free它完成時。

+0

關於第一個問題:是的,我已經這樣做了,但我在這裏做了一個錯字。 關於改變你的記憶可能是對的。現在就試試吧。 – gkaran89 2012-03-30 10:03:37

+0

每次數組都比malloc更容易。不是嗎? – 2012-03-30 10:09:00

+1

他正在做'while(1)'無限循環,所以可能不會。我們甚至不知道陣列應該有多寬。 – ArjunShankar 2012-03-30 10:12:30