4

我编写了一个简单的演示程序,以便我可以理解该pthread_join()功能。

我知道如何使用该pthread_condition_wait()函数来允许异步线程,但我试图了解如何使用该pthread_join()函数进行类似的工作。

在下面的程序中,我将Thread 1s ID 传递给Thread 2s函数。在Thread 2s函数中,我调用该pthread_join()函数并传入Thread 1s ID。我希望这会导致线程 1先运行,然后线程 2再运行,但我得到的是它们都同时运行。

这是因为一次只有一个线程可以使用该函数,并且当我从主线程调用它时我pthread_join()已经在使用该函数了吗?pthread_join()

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

void *functionCount1();
void *functionCount2(void*);

int main()
{

    /* 
        How to Compile
         gcc -c foo
         gcc -pthread -o foo foo.o
    */

    printf("\n\n");

    int rc;
    pthread_t thread1, thread2;

    /* Create two thread --I took out error checking for clarity*/
    pthread_create( &thread1, NULL, &functionCount1, NULL)
    pthread_create( &thread2, NULL, &functionCount2, &thread1)

    pthread_join( thread1, NULL);
    pthread_join( thread2, NULL);

    printf("\n\n");
    exit(0);
}

void *functionCount1()
{

    printf("\nFunction 1");
        sleep(5);
    printf("\nFunction 1");

    return(NULL);
}

void *functionCount2(void* argument)
{

    pthread_t* threadID = (pthread_t*) argument;

    pthread_join(*threadID, NULL);

    printf("\nFunction 2");
        sleep(5);
    printf("\nFunction 2");

    return(NULL);
}

输出:

在此处输入图像描述

4

3 回答 3

7

当使用创建pthread_create()线程时,两个线程同时开始执行,并且它们的执行顺序没有固定的顺序。顺序取决于操作系统调度和可用处理器的数量等。无论如何,这无法确定,这就是线程的重点。

当你调用时会发生什么pthread_join(),调用者等待加入的线程终止。所以主线程等待thread1终止,然后等待thread2。但是当 main 等待时thread1thread2可能已经完成执行并已经终止。在这种情况下,pthread_join(thread2, NULL);将立即返回。

您的代码中有一个更大的问题。您将thread1的 ID 传递给thread2. 但是,如果在开始thread1之前完成执行thread2,那么您将使用无效的线程标识符,从而导致未定义的行为。另一个问题是你的主线程和thread2都试图加入thread1. 简而言之,pthread_join()不是多线程之间同步的正确工具。正如您所说,您为此目的使用条件变量/互斥锁。

我建议,你pthread_join()thread2, 中删除来修复未定义的行为,如果你想要线程的串行执行,那么你必须一个接一个地创建线程并让它们等待前一个线程终止(pthread_join())。但是这样做几乎没有实际用途。或者让线程在执行任何操作之前等待条件变量,您可以使用条件变量使线程按照您希望的顺序进行通信。

于 2014-11-12T19:55:49.703 回答
3

您调用未定义的行为。手册页: http: //man7.org/linux/man-pages/man3/pthread_join.3.html

Joining with a thread that has previously been joined results in undefined behavior.

此外,第一个线程可能会在第二个线程之前完成执行。如果你想要这样的东西,最好使用pthread_cond_wait().

于 2014-11-12T19:57:30.213 回答
1

pthread_join 手册页(强调我的):

如果多个线程同时尝试加入同一个线程,结果是不确定的。如果调用 pthread_join() 的线程被取消,那么目标线程将保持可连接状态(即,它不会被分离)。

看来您正是在这种情况下,主线程和线程 2 都在尝试pthread_join线程 1。

您应该为每个线程明确定义一个负责其管理的“所有者线程”。责任链应该形成一个层次的线程树(即没有循环或多个父级)。

于 2014-11-12T19:59:19.467 回答