我尝试用这个命令编译这个简单的pthreads程序
$ gcc -pthread -o pthreads pthreads.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void *myThread(void *arg);
int main()
{
pthread_t mythread;
int ret;
ret = pthread_create( &mythread, NULL, myThread, NULL );
if (ret != 0){
printf( "Can't create pthread: %s", strerror(errno));
exit(-1);
}
return 0;
}
void *myThread(void *arg){
// Thread code goes here..
printf("OK! NOW ON THE THREAD\n");
pthread_exit(NULL);
}
但是在尝试./pthreads时没有输出!!
答案 0 :(得分:6)
您需要等待线程完成。否则,您可能会在线程开始执行之前退出。
...
pthread_create( &mythread, NULL, myThread, NULL );
...
// Wait for the thread to finish.
pthread_join( mythread, NULL);
答案 1 :(得分:1)
你没等等你的线程完成。您需要使用pthread_join()。
答案 2 :(得分:1)
你的问题来自于你的主线程是从main返回,因此调用exit(或_exit)。程序退出时,所有正在运行的线程都将被终止在这种情况下,工作线程在被杀之前没有时间执行。
在从main返回之前,您可以使用pthread_join
等待线程的完成。
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
void *myThread(void *arg);
int main()
{
void* thread_return;
pthread_t mythread;
int ret;
ret = pthread_create(&mythread, NULL, myThread, NULL);
if (ret != 0)
{
printf("Can't create pthread: %s\n", strerror(errno));
exit(-1);
}
ret = pthread_join(mythread, &thread_return);
if (ret != 0)
{
printf("Can't join pthread: %s\n", strerror(errno));
exit(-1);
}
return 0;
}
void *myThread(void *arg)
{
printf("OK! NOW ON THE THREAD\n");
pthread_exit(NULL);
}
答案 3 :(得分:1)
Sanjit的回答当然是正确的,但为了扩大你的线程工具箱,你也可以看一下pthread_barrier_wait
。如果你有一个包含大量线程的简单程序,并且main
看起来像是“启动所有工作线程并等待它们完成”,那么让主要人员和所有工人只需等待障碍就可以避免必须存储所有工作线程ID并将它们连接到for循环中。障碍还有许多其他巧妙的用途,有时可以让你避免因使用互斥和条件变量做同样的事情而带来不必要的复杂性。