1

由于我得到的结果,我无法理解 pthread_join() 函数。

如果 pthread_join() 应该暂停调用线程,直到给定线程 id 的线程完成它的工作,那么为什么以下代码不先执行线程 1工作,然后执行线程 2工作。它们都是同时发生的。

如果我取出两条 pthread_join() 行(从 main 中),程序将终止并且没有任何反应。这是否意味着主线程是两个连接函数的调用进程,而主线程正在等待其他两个新创建的线程完成?

#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);
}

输出:

在此处输入图像描述

sleep注释掉的输出:

在此处输入图像描述

有人可以解释为什么 pthread_join 没有按照文档让您相信的那样做吗?

4

1 回答 1

3

如果pthread_join()应该暂停调用进程,直到给定线程ID的线程完成它的工作......

这不太正确:pthread_join()应该暂停调用线程,而不是调用进程。由于您是pthread_join()从运行main函数的线程调用的,因此允许其他两个线程同时进行,即它们在您的示例中执行的方式。

您注释掉的代码不起作用的原因是您传递了一个指向 的指针pthread_t,但随后您pthread_t在线程运行函数中将其转换为纯文本(即pthread_t*变为pthread_t)。修复这个问题应该可以让你的代码产生你期望的结果:

void *functionCount2(void* argument)
{
    pthread_t *threadID = (pthread_t*) argument;
    pthread_join(*threadID, NULL);
    printf("\nFunction 2");
    sleep(5);
    printf("\nFunction 2");
    return(NULL);
}

此外,您应该pthread_join( thread1, NULL);从您的函数中删除,因为指定同一目标线程main的多个同时调用的结果是未定义的。pthread_join()

于 2014-11-12T19:01:19.270 回答