pthread_create() 給建立的執行緒傳遞引數

發表於2016-12-29

對於pthread_create為建立執行緒傳遞引數的問題,先前只知道傳遞單個引數的方法,現在需要傳遞多個引數。

對於新手的我比較糾結,因此,上網查詢資料,發現CU裡面的一個帖子(帖子地址後面給出)。

下面把帖子中認為對自己有用的知識摘錄下來,以後經常看看。

帖子內容:

1、傳遞int、short、char等,大小少於一個指標長度型別的,強制轉換為(void*),然後線上程函式裡轉換回來即可;

2、傳遞多個引數的時候,建立執行緒的函式內malloc()一個結構體,把引數都放進去,然後傳指標。等執行緒函式結束後,線上程內部free();

3、前面同2,但是在主執行緒中把子執行緒join回來,然後在主執行緒中free();

但是,對於第二種情況,一個函式malloc(),另一個函式free(),感覺不爽;
對於第三種情況,雖然做到同一個函式內申請釋放了,但是子執行緒無法detach,且主執行緒必須等待所有子執行緒返回後才能退出,也不爽。

有啥好辦法沒?

下面是其中部分回覆:

1、對於C++,經常的做法是:執行緒函式是類的靜態函式,傳遞的引數時類的成員;

2、用外部變數(全域性變數),定義成陣列,然後每個執行緒編號做下標;也就是,傳控制程式碼/下標比傳指標安全,可以多一次有效性檢查;

3、直接在建立函式裡用臨時變數建立一個結構也可以
這種方法是錯誤的,建立函式啟動執行緒後不會阻塞,直接就返回了,臨時變數也就失效了,等新執行緒再訪問該臨時變數的地址,會遭遇野指標。

4、關於傳遞多個引數,一種比較通用的方式是為pthread_create做一次函式包裝,由包裝函式完成一些瑣碎的事情,下面舉例說明擴充套件成3個引數的例子,之後呼叫my_thread_create()即可處理多於一個引數的例子。

帖子地址:http://bbs.chinaunix.net/thread-1742995-1-1.html

感謝各位提供的方法,謝謝。

相關文章