首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Pthread_join的工作(tid,&retval);

Pthread_join的工作(tid,&retval);
EN

Stack Overflow用户
提问于 2015-09-05 00:10:57
回答 1查看 122关注 0票数 0

为什么主函数调用pthread_join( tid,&retval)不等待线程id等于tid的线程关闭?

细节-我正在尝试创建具有多线程的简单文件复制程序,以便我可以了解更多关于互斥锁、信号量和死锁的知识,但在主线程中没有使用sleep()我的程序在没有复制数据或不完整的copying.Note的情况下终止,我在子线程中调用pthread_exit(retval)。

这是代码http://ideone.com/mexxmk,这是另一段运行无限计数器的代码,目的是检查子线程是否提前结束,即使调用了pthread_join。http://ideone.com/0DIxUK - prematurely.In :它不会结束结果,后面的代码主线程会等待子线程关闭。那么为什么第一个代码不是这样运行的呢?

EN

回答 1

Stack Overflow用户

发布于 2015-09-05 01:16:30

一种方法(假设线程实际完成,以及其他可能的陷阱,我还没有学到)是使用互斥,或者类似于:

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32409351

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档