我有这段代码:
#include <stdlib.h>
#include <stdio.h>
#include <pthread.h>
#include <time.h>
int number;
pthread_mutex_t *mutex;
pthread_t *threads;
void *PrintHello(void *threadid)
{
long tid;
tid = (long)threadid;
printf("Hello World! It's me, thread #%ld!\n", tid);
time_t rawtime;
struct tm * time_start;
time ( &rawtime );
time_start = localtime ( &rawtime );
printf ( "The number %ld thread is created at time %s \n",tid, asctime (time_start));
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
int i,rc;
printf("give threads");
scanf("%d",&number);
mutex = calloc( number, sizeof(*mutex));
threads = calloc(number, sizeof(*threads));
for (i = 0; i < number;i++) {
pthread_mutex_init( &mutex[i],NULL);
}
for(i=0; i<number; i++){
printf("In main: creating thread %d\n", i);
rc = pthread_create(&threads[i], NULL, PrintHello, (void *)i);
if (rc){
printf("ERROR; return code from pthread_create() is %d\n", rc);
exit(-1);
}
}
return 0;
}
此代码的目的是要求用户提供要创建的线程数,并在创建线程后,线程本身将打印2条消息,说明线程的编号和时间它被创造了。
问题是主要内部消息"In main: creating thread"
正在显示,但线程内的消息有时不会显示。
例如,它将创建3个线程,并且只有1个线程将显示其消息,并且该线程也不会显示创建的时间。我不知道代码是否有问题。
答案 0 :(得分:10)
根本原因:
在子线程获得完成任务的机会之前,您的main()
退出。
<强>解决方案:强>
您需要确保main()
等待所有线程完成其工作
你需要使用:
<强> pthread_join() 强>
实现此功能。在从main()
返回之前添加以下内容:
for(i=0; i<number; i++)
{
pthread_join(threads[i], NULL);
}
其他问题:
答案 1 :(得分:3)
从main()
返回相当于调用exit(...)
,这将终止整个过程。您可以使用pthread_join()
等待每个非主线程,就像另一个回答建议一样,或者您可以在pthread_exit(NULL)
的末尾调用main()
:它会退出初始线程,但是其他线程将继续运行。