我有以下C程序代码。应该有一个幻影错误,有时只会发生,但每当我运行它,它只是工作正常。我无法找到错误在哪里
#include <pthread.h>
#include <stdio.h>
#include <string.h>
struct thread_data {
char name[255];
unsigned int num_iterations;
unsigned int some_answer;
};
void* thread_entrypoint(void *arg)
{
int i;
struct thread_data *tdata = (struct thread_data*)arg;
tdata->some_answer = 0;
for (i=0; i<tdata->num_iterations; i++) {
tdata->some_answer += i;
}
printf("Name: %s, Answer: %u\n", tdata->name, tdata->some_answer);
pthread_exit(NULL);
}
int main(int argc, char *argv[])
{
pthread_t tid;
struct thread_data tdata;
strcpy(tdata.name, "Spartacus");
tdata.num_iterations = 100;
pthread_create(&tid, NULL, thread_entrypoint, &tdata);
pthread_detach(pthread_self());
pthread_exit(NULL);
}
答案 0 :(得分:5)
问题是您将线程指针从主线程传递给局部变量,然后通过退出主线程或从函数返回来离开作用域:
struct thread_data tdata;
您必须在堆上分配此结构才能使其可靠地运行。它主要取决于退出主线程是否比完成子线程更快。它可能取决于CPU的数量,当前的过程负载等,所以它非常随机。
答案 1 :(得分:3)
在退出主线程之前,需要等待线程tid
完成,以便tdata
保持有效,以便在stdout中看到输出之前进程不会终止
要执行此操作,您应在致电pthread_join(tid,...)
后致电pthread_create(&tid,...)
(请参阅https://computing.llnl.gov/tutorials/pthreads/#Joining)