我正在使用gcc在linux上编写一个程序。 如果我没有使用那个睡眠声明 它将随机打印“线程创建”2,3或4次。谁能解释我这种行为? //以下代码只是一个示例,我知道创建一个线程只是为了打印一个字符串:)
void* makeRequest(void* arg) {
printf("Thread created\n");
}
int main(){
pthread_t thr[10];
for(i=0; i<3; i++){
pthread_create(&thr[i], 0, makeRequest, &i);
sleep(1);
}
}
P.S。我包括了pthread.h和编译选项-pthread
答案 0 :(得分:4)
您应该加入您创建的所有主题,并在退出整个过程时结束main
。
或者,您可以使用main
结束pthread_exit
。
答案 1 :(得分:2)
除了其他评论,
pthread_create(&thr[i], 0, makeRequest, &i);
不正确,因为i
是一个局部变量,因此&i
是您对pthread_create的所有调用的同一指针
您通常应该将数据指针指向您的线程例程 - 其中线程例程是makeRequest
静态指针或唯一指针(每个线程都是唯一的);在实践中,将它指向一些malloc
- ed memory。
更好的做法是声明一些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
通过malloc
进行堆分配,请不要忘记free
在适当的时间,例如线程结束后(例如,在pthread_join之后 - 编辑它)。您可能也对Boehm's GC感兴趣并使用GC_malloc
代替malloc
(然后,不要担心释放内存,GC会这样做。)
如果线程正在访问共享数据,则应使用某些[全局或静态]互斥锁(使用pthread_mutex_lock
&amp; pthread_mutex_unlock
)序列化对其的访问权限
在退出-e.g之前,不要忘记在所有线程上调用pthread_join
。从main
返回。
我建议在pthreads tutorial上阅读一些advanced linux programming和一些书。
答案 2 :(得分:1)
你需要:
for(i = 0; i < 3; i++)
{
pthread_join(thr[i], NULL);
}
正如您所写的那样,在主要返回之前没有任何东西等待您的线程完成并退出整个进程,从而终止线程。
答案 3 :(得分:1)
首次使用加入,如果您不使用,则无需发送&i
。
随机打印“创建的线程”2,3或4次。
当主线程死亡时,所有子线程也会死掉。所以你需要等待加入。
随机。:因为我们不知道在线程上下文切换哪个会有机会。它可能是主线程或子线程。
for(i=0; i<3; i++){
pthread_create(&thr[i], 0, makeRequest, &i);
}
for(i=0; i<3; i++){
pthread_join(thr[i], NULL);
}
第二次使用 -lpthread
不 -pthread
$ gcc file.c -lpthread -o output
<强> EDITED 强>
-pthread
使用“pthreads”库添加对多线程的支持。此选项为预处理器和链接器设置标志:Jens Gustedt comment