C linux pthread需要睡眠才能工作

时间:2012-12-28 13:37:17

标签: c linux gcc pthreads

我正在使用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

4 个答案:

答案 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

Difference between -pthread and -lpthread