替代pthread_timedjoin_np

Der*_*rek 7 c macos pthreads

我试图弄清楚如何摆脱对pthread_timedjoin_np的依赖,因为我试图在OSX上构建一些代码.

现在我有一个我正在弹出的线程队列,执行pthread_timedjoin_np,如果他们没有返回,他们会被推回队列.

为每个线程调用的thread_function的结尾执行pthread_exit(0); 以便接收线程可以检查返回值为零.

我想我可能会尝试使用pthread_cond_timedwait()来实现类似的效果,但我想我错过了一步.

我以为我能够使工作线程A信号成为互斥锁中的条件和pthread_exit(),并且工作线程B可以唤醒信号,然后是pthread_join().问题是,线程B不知道哪个线程抛出了条件信号.我是否需要明确地将其作为条件信号的一部分传递或者什么?

谢谢

德里克

R..*_*R.. 6

这是的可移植实现pthread_timedjoin_np。这有点贵,但它是一个完整的替代产品:

struct args {
    int joined;
    pthread_t td;
    pthread_mutex_t mtx;
    pthread_cond_t cond;
    void **res;
};

static void *waiter(void *ap)
{
    struct args *args = ap;
    pthread_join(args->td, args->res);
    pthread_mutex_lock(&args->mtx);
    args->joined = 1;
    pthread_mutex_unlock(&args->mtx);
    pthread_cond_signal(&args->cond);
    return 0;
}

int pthread_timedjoin_np(pthread_t td, void **res, struct timespec *ts)
{
    pthread_t tmp;
    int ret;
    struct args args = { .td = td, .res = res };

    pthread_mutex_init(&args.mtx, 0);
    pthread_cond_init(&args.cond, 0);
    pthread_mutex_lock(&args.mtx);

    ret = pthread_create(&tmp, 0, waiter, &args);
    if (ret) goto done;

    do ret = pthread_cond_timedwait(&args.cond, &args.mtx, ts);
    while (!args.joined && ret != ETIMEDOUT);

    pthread_mutex_unlock(&args.mtx);

    pthread_cancel(tmp);
    pthread_join(tmp, 0);

    pthread_cond_destroy(&args.cond);
    pthread_mutex_destroy(&args.mtx);

    return args.joined ? 0 : ret;
}
Run Code Online (Sandbox Code Playgroud)

自从我当场编写并没有对其进行测试以来,可能会有一些小错误,但是这个概念是合理的。


Mar*_*mes 2

生产者-消费者队列。让线程在退出之前将其自身及其结果(如果有)放入队列中。排队等候。

没有轮询,没有延迟。

根据您当前的设计,您必须 join() 返回的线程获取 valueptr 并确保它们被销毁。

也许您有时可以转移到真正的线程池,其中任务项排队到永远不会终止的线程(因此消除了线程创建/终止/销毁开销)?