對於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()即可處理多於一個引數的例子。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
typedef void * (*FUNCALLBACK)(void * arg1, void * arg2, void * arg3); typedef stuct { FUNCALLBACK callback; void * arg1; void * arg2; void * arg3; } ARGS; void * sub_thread_entry(void * arg) { ARGS args; /* retrieve args */ args.callback = ((ARGS *)arg)->callback; args.arg1 = ((ARGS *)arg)->arg1; args.arg2 = ((ARGS *)arg)->arg2; args.arg3 = ((ARGS *)arg)->arg3; free(arg); return args.callback(args.arg1, args.arg2, args.arg3); } int my_pthread_create(pthread_t *thread, const pthread_attr_t *attr, FUNCALLBACK start_routine, void *arg1, void * arg2, void * arg3) { ARGS * args; if (NULL == (args=(ARGS *)malloc(sizeof(ARGS)))) return -1; /* push args into buffer */ args->callback = start_routine; args->arg1 = arg1; args->arg2 = arg2; args->arg3 = arg3; return pthread_create(pthread, attr, sub_thread_entry, args); } |
帖子地址:http://bbs.chinaunix.net/thread-1742995-1-1.html
感謝各位提供的方法,謝謝。