建立多個執行緒的引數傳遞問題

2021-06-05 21:42:34 字數 953 閱讀 3039

先看下面的程式thread1.c:

#include #include #include void *thread_func(void *var);

int main(void)

pthread_exit(null);

}void *thread_func(void *var)

編譯:gcc thread1.c -pthread -o thread1

執行:./thread1

這個程式我們期望的結果是:輸出不重複的thread 0~19,但是實際上是有重複的。如果子執行緒中的賦值語句在主線程中下乙個迴圈var = i之前執行,那麼結果是正確的,然而如果是在之後才執行,下乙個i就會覆蓋掉前乙個var,這樣就會出現相同的結果。

解決方法,thread2.c:

#include #include #include void *thread_func(void *var);

int main(void)

pthread_exit(null);

}void *thread_func(void *var)

pthread_detach(pthread_self());

printf("thread %d\n", x);

}

編譯:gcc thread2.c -pthread -o thread2

執行:./thread2

之前是因為在同一塊記憶體上傳值會造成覆蓋,現在我們為每個新建立的執行緒都建立一塊記憶體,這樣他們每個執行緒都有一塊記憶體供傳值,就不會覆蓋別人的記憶體了。

上面只是舉個例子,不用中間變數var而是直接把i作為引數傳遞也是沒什麼問題的。關鍵是這個引數也許不是那麼簡單,可能是accept客戶端socket描述符,所以這樣舉例子也是可以的。

當然,上面問題利用執行緒間同步也是可以解決的。

C params傳遞多個引數

c 開發語言中 params 是關鍵字,可以指定在引數數目可變處採用引數的方法引數。在函式的引數數目可變而執行的 差異很小的時候很有用!params關鍵字表示函式的引數是可變個數的,即可變的方法引數,例如console.writeline i,j 就像delphi 裡 writeln 函式一樣,用於...

Scrapy Callback傳遞多個引數方式

在scrapy提交乙個鏈結請求是用 request url,callback func 這種形式的,而parse只有乙個response引數,如果自定義乙個有多引數的parse可以考慮用下面的方法實現多個引數傳遞。def parse self response yield request url c...

mybatis傳遞多個引數

據我目前接觸到的傳多個引數的方案有三種。dao層的函式方法 1 publicuserselectuser stringname,string area 1 2 3 selectid selectuser resultmap baseresultmap select fromuser user twh...