你能解释一下为什么在Linux(不是在Mac)中,当我这样做时会出现Segmentation Fault:
pthread_join(thread2, (void**)&status);
pthread_join(thread1, (void**)&status);
但我这样做是可以的:
pthread_join(thread1, (void**)&status);
pthread_join(thread2, (void**)&status);
我在Mac上尝试过,一切都很好,但是在Linux中,代码只有在我连接thread1之后才能正常运行,然后才能连接thread2 ......
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *print_msg( char *ptr );
main(){
pthread_t thread1, thread2;
char *message1 = "Ping";
char *message2 = "Pong";
int status;
pthread_create(&thread1, NULL, print_msg, message1);
printf("tid thread1= %d\n", (int)thread1);
pthread_create(&thread2, NULL, print_msg, message2);
printf("tid thread2= %d\n", (int)thread2);
pthread_join(thread2, (void**)&status);
pthread_join(thread1, (void**)&status);
printf("Thread 1 end with: %d\n", (int)status);
printf("Thread 2 end with: %d\n", (int)status);
exit(0);
}
void *print_msg( char *ptr ){
char *msg;
void *val=0;
msg = (char *) ptr;
printf("%s \n", msg);
pthread_exit(val);
}
答案 0 :(得分:0)
你的(void**)&status
演员阵容就是问题所在。
status
是一个整数,其中包含未初始化的值。它也不是指针。 sizeof(status)
可能是4.虽然sizeof(void*)
可能是8.但是当调用pthread_join时,它会将堆栈的4个字节丢弃到status
的堆栈位置之外。这很可能是主要功能的返回地址。但在这一点上,我们处于未定义的行为领域。
将status
的声明更改为void*
。正如您应该使用任何指针值,将其初始化为NULL。那就是:
void* status = NULL;
然后,简化你的pthread_join语句,这样你就不需要演员了。
pthread_join(thread2, &status);
pthread_join(thread1, &status);
答案 1 :(得分:-1)
我想我已经明白了。
问题在于Linux没有足够的时间来创建管理线程所需的所有内容,因为我们立即要求加入。 如果我们只是在我们解决问题之间插入一条愚蠢的指令:
...
pthread_create(&thread1, NULL, print_msg, message1);
printf("tid thread1= %d\n", (int)thread1);
pthread_create(&thread2, NULL, print_msg, message2);
int a=0;
pthread_join(thread2, (void**)&status);
pthread_join(thread1, (void**)&status);
...