找到C程序中的错误

时间:2016-01-28 20:28:40

标签: c debugging

我有以下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);
}

2 个答案:

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