我正在接近C中的pthreads,我开始编写非常愚蠢的程序来掌握它们。我试图创建一个包含两个线程的程序,他们应该打印他们的名字,并在终止执行时收集他们的状态。所以我的代码是:
//Function declaration
void *state_your_name(char*);
//Function definition
//Passing a string as parameter for
//outputting the name of the thread
void *state_your_name(char *name) {
//Declaration of the variable containing the return status
void* status;
//Printing out the string
printf("%s\n", name);
//Exiting the thread and saving the return value
pthread_exit(status);
}
int main(void) {
pthread_t tid_1, tid_2;
void * status;
//Creating thread 1...
if (pthread_create(&tid_1, NULL, state_your_name, "Thread 1")) {
printf("Error creating thread 1");
exit(1);
}
//Creating thread 2...
if (pthread_create(&tid_2, NULL, state_your_name, "Thread 2")) {
printf("Error creating thread 2");
exit(1);
}
//Waiting for thread 1 to terminate and
//collecting the return value...
if (pthread_join(tid_1, (void *) &status)) {
printf("Error joining thread 1");
exit(1);
}
printf("Thread 1 - Return value: %d\n", (int)status );
//Waiting for thread 2 to terminate and
//collecting the return value...
if (pthread_join(tid_2, (void *) &status)) {
printf("Error joining thread 2");
exit(1);
}
printf("Thread 2 - Return value: %d\n", (int)status );
return 0;
}
我希望输出如下:
Thread 1
Thread 2
Thread 1 - Return value: 0
Thread 2 - Return value: 0
但我的问题是Thread 1
的返回值为733029576
,但Thread 2
按预期返回0
;就像状态变量未初始化并包含垃圾一样。我错过了什么?
答案 0 :(得分:5)
您在输出中看到垃圾值的原因是void *status
的本地state_your_name
变量未初始化:
void *state_your_name(char *name) {
//Declaration of the variable containing the return status
void* status = NULL; // <<===== Add initialization here
//Printing out the string
printf("%s\n", name);
//Exiting the thread and saving the return value
pthread_exit(status);
}
有了这个改变,你的程序应该产生你期望的输出。
请注意,直接从status
返回state_your_name
是调用pthread_exit
的替代方法:您可以将该调用替换为return status
。
答案 1 :(得分:2)
state_your_name()
中的代码未初始化它返回的status
,因此您会收到不确定的信息。你不幸的是你得到零而不是垃圾。
答案 2 :(得分:2)
您正在返回指向线程堆栈中定义的status
的指针。线程退出后,该内存可能会消失。你不应该在你的线程中声明status
。你最好只在return 0
内做state_your_name()
。
答案 3 :(得分:0)
要获得可预测的不同返回值,请尝试此
void *state_your_name(char *name) {
//Declaration of the variable containing the return status
void* status= (void *)(int)name[0];
....
这将返回名称第一个字母的ascii代码。
另外,我知道pthread_join的实现,将void **作为最后一个参数,所以
if (pthread_join(tid_2, &status)) {
是正确的(你的演员(void*)
有点误导)