我试图弄清楚如何摆脱对pthread_timedjoin_np的依赖,因为我试图在OSX上构建一些代码.
现在我有一个我正在弹出的线程队列,执行pthread_timedjoin_np,如果他们没有返回,他们会被推回队列.
为每个线程调用的thread_function的结尾执行pthread_exit(0); 以便接收线程可以检查返回值为零.
我想我可能会尝试使用pthread_cond_timedwait()来实现类似的效果,但我想我错过了一步.
我以为我能够使工作线程A信号成为互斥锁中的条件和pthread_exit(),并且工作线程B可以唤醒信号,然后是pthread_join().问题是,线程B不知道哪个线程抛出了条件信号.我是否需要明确地将其作为条件信号的一部分传递或者什么?
谢谢
德里克
这是的可移植实现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)
自从我当场编写并没有对其进行测试以来,可能会有一些小错误,但是这个概念是合理的。
生产者-消费者队列。让线程在退出之前将其自身及其结果(如果有)放入队列中。排队等候。
没有轮询,没有延迟。
根据您当前的设计,您必须 join() 返回的线程获取 valueptr 并确保它们被销毁。
也许您有时可以转移到真正的线程池,其中任务项排队到永远不会终止的线程(因此消除了线程创建/终止/销毁开销)?
| 归档时间: |
|
| 查看次数: |
3759 次 |
| 最近记录: |