Synchronization pthread_join(tid和retval)的工作;

Synchronization pthread_join(tid和retval)的工作;,synchronization,multithreading,deadlock,Synchronization,Multithreading,Deadlock,为什么调用pthread_jointid和&retval的主函数不等待线程id等于tid的线程关闭 详细信息-我正在尝试创建带有多线程的简单文件复制程序,这样我就可以了解更多关于互斥锁、信号量和死锁的信息,但不必在主线程中使用睡眠,我的程序将在不复制数据或不完全复制的情况下终止。注意,我正在子线程中调用pthread_exitretval 这是代码 下面是另一段代码,它运行无限计数器以检查即使在调用pthread_join时子线程是否过早结束。 -结果:它不会过早结束。在后一个代码中,主线程会等

为什么调用pthread_jointid和&retval的主函数不等待线程id等于tid的线程关闭

详细信息-我正在尝试创建带有多线程的简单文件复制程序,这样我就可以了解更多关于互斥锁、信号量和死锁的信息,但不必在主线程中使用睡眠,我的程序将在不复制数据或不完全复制的情况下终止。注意,我正在子线程中调用pthread_exitretval

这是代码 下面是另一段代码,它运行无限计数器以检查即使在调用pthread_join时子线程是否过早结束。 -结果:它不会过早结束。在后一个代码中,主线程会等待子线程关闭。
因此,为什么第一个代码没有以这种方式运行。

一种假设线程实际完成的方法,以及我尚未了解的其他可能的问题,就是使用互斥锁,或者类似以下内容的方法:

#include <err.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <unistd.h>

pthread_mutex_t Lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t Job_Done = PTHREAD_COND_INITIALIZER;

unsigned long Threads_Completed;

void *worker(void *unused);

int main(void)
{
    pthread_t *tids;
    struct timespec wait;

    if ((tids = calloc(sizeof(pthread_t), 42)) == NULL)
        err(EX_OSERR, "could not calloc() threads list");

    fprintf(stderr, "dbg starting...\n");
    for (unsigned int i = 0; i < 42; i++) {
        if (pthread_create(&tids[i], NULL, worker, NULL) != 0)
            err(EX_OSERR, "could not pthread_create() thread %u", i);
    }

    wait.tv_sec = 7;
    wait.tv_nsec = 0;

    for (;;) {
        pthread_mutex_lock(&Lock);
        if (Threads_Completed == 42)
            break;
        pthread_cond_timedwait(&Job_Done, &Lock, &wait);
        pthread_mutex_unlock(&Lock);
    }
    fprintf(stderr, "dbg all done!\n");

    exit(EXIT_SUCCESS);
}

void *worker(void *unused)
{
    sleep(3 + rand() % 7);     // actual work here
    fprintf(stderr, "dbg done!\n");

    pthread_mutex_lock(&Lock);
    Threads_Completed++;
    pthread_mutex_unlock(&Lock);
    pthread_cond_signal(&Job_Done);

    return (void *) 0;
}

您是否调用pthread_detachtid或使用pthread_attr_setdetachedstate在分离状态下创建线程?不,我不知道它们,也没有调用它们。我应该发布源代码吗?是,发布代码会很有帮助-谢谢。抱歉,我不知道在这个网站上发布代码,所以我使用了ideone.com网站。一些字段在代码中是多余的,注释是无用的,它们只是用来做实验。你确定capsule->val1是非零的吗?我建议您尝试创建一个简单的示例来练习您遇到问题的代码。可能有一个计数为10的线程,其间有一秒的暂停。创建它,让它运行,对它执行pthread_连接,查看pthread_连接的行为是否符合预期。然后开始逐渐增加复杂性。类似的方法会起作用,但没有必要,因为pthread_join会帮你做到这一点。pthread_join不是问题所在。@vishvajeetpa直到我坚持我以前的建议为止。您试图一次编写和测试太多的代码。我建议您从一个工作的pthread_create/pthread_join开始,然后逐步添加和测试—一次添加一点代码。这将是追踪出问题的最简单方法。