先看下面的程式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...