除了其他备注外,
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 编程的书。