除了其他备注外,
pthread_create(&thr[i], 0, makeRequest, &i);
是不正确的,因为i
它是一个局部变量,所以你对pthread_create&i
的所有调用都是同一个指针
您通常应该将数据指针指向您的线程例程 - 这里线程例程是makeRequest
静态指针或唯一指针(每个线程唯一);在实践中,使其成为指向某些malloc
-ed 内存的指针。
更好的做法是声明 some struct my_thread_data_st
,在堆中唯一地分配它
struct my_thread_data_st* td = malloc(sizeof(struct my_thread_data_st));
if (!td) perror("malloc td"), exit(EXIT_FAILURE);
memset (td, 0, sizeof(struct my_thread_data_st));
// fill td appropriately, then
pthread_create(&thr[i], 0, makeRequest, td);
int
或者你可以有一个例如-s的数组,例如int num[4];
,适当地初始化它,然后pthread_create(&thr[i], 0, makeRequest, &num[i]);
当然,如果td
是 heap-allocated thru malloc
,请不要free
在适当的时候忘记它,例如在线程结束之后(例如在pthread_join之后)。您可能还对Boehm 的 GC感兴趣并使用GC_malloc
而不是malloc
(然后,不要担心释放内存,GC 会这样做)。
如果线程正在访问共享数据,您应该使用一些[全局或静态]互斥锁(使用pthread_mutex_lock
& pthread_mutex_unlock
)序列化对它的访问
不要忘记pthread_join
在退出之前调用所有线程 - 例如从main
.
我建议阅读一些pthreads 教程和一些关于高级 linux 编程的书。