pthread_join中的更改顺序将在Linux

时间:2016-11-12 09:02:31

标签: c multithreading pthreads pthread-join

你能解释一下为什么在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);
}

2 个答案:

答案 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);
...