1. 函數原型 int pthread_create(pthread_t *thread, const pthread_attr_t *attr,
void *(*start_routine) (void *), void *arg);
本文主要討論最後一個參數,同時傳遞多個的問題
(若是隻傳遞一個 int char 等長度小於指針的數據類型,能夠直接傳,而後在線程內把 (void *) 強制轉換)多線程
2. 錯誤示例 是在一本書上看到的,也是寫本文的初衷 異步
錯誤緣由: fds_for_new_worker 是局部變量,線程建立異步的,pthread_create 後, else if 也結束了,該變量的生命週期結束,worker 線程訪問到的將是野指針,容易形成數據訪問錯誤或更嚴重的內存錯誤。函數
3. 正確傳遞方法
A. 使用全局變量(視狀況使用)
變量的做用域不會消失,但要注意多線程變量同步問題
B. 動態分配變量空間(推薦)
在 pthread_create 前 malloc() 申請空間,在線程內使用完後 free()線程
附:錯誤代碼驗證指針
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <pthread.h> struct data_st { int a; int b; }; static void *start_routine(void *user) { // sleep(1); struct data_st *data = (struct data_st *)user; printf("in thread, data->a = %d, data->b = %d\n", data->a, data->b); pthread_detach(pthread_self()); return NULL; } int main(void) { int i; int ret; pthread_t pt; for (i = 0; i < 5; ++i) { struct data_st data; data.a = i; data.b = i * 2; ret = pthread_create(&pt, NULL, start_routine, &data); if (0 != ret) { printf("%s(): Thread creation failed\n", __FUNCTION__); exit(EXIT_FAILURE); } } pause(); return 0; }
運行結果:code
能夠看出,這種錯誤的傳遞方式並無獲得應有的結果生命週期