【发布时间】:2011-12-13 21:15:38
【问题描述】:
我有 10 个线程应该等待信号。 到目前为止,我只是简单地完成了 'sleep(3)',并且工作正常,但是是否有更安全的方法来确保所有线程都已创建并且确实在等待。
我在关键区域进行了以下构造,在等待之前,增加一个计数器,告诉有多少线程正在等待。但是我必须有一个额外的互斥体和条件来向主发送所有线程都已创建的信号,这似乎过于复杂。
我是否缺少一些基本的线程设计模式?
谢谢 编辑:固定类型
编辑:澄清以下信息
在这种情况下,屏障不起作用,因为我不想让我的线程等到所有线程都准备好。 'cond_wait' 已经发生了这种情况。
我有兴趣让主函数知道,什么时候所有线程都准备好并等待。
//mutex and conditional to signal from main to threads to do work
mutex_t mutex_for_cond;
condt_t cond;
//mutex and conditional to signal back from thread to main that threads are ready
mutex_t mutex_for_back_cond;
condt_t back_cond;
int nThreads=0;//threadsafe by using mutex_for_cond
void *thread(){
mutex_lock(mutex_for_cond);
nThreads++;
if(nThreads==10){
mutex_lock(mutex_for_back_cond)
cond_signal(back_cond);
mutex_unlock(mutex_for_back_cond)
}while(1){
cond_wait(cond,mutext_for_cond);
if(spurious)
continue;
else
break;
}
mutex_unlock(mutex_for_cond);
//do work on non critical region data
}
int main(){
for(int i=0;i<10)
create_threads;
while(1){
mutex_lock(mutex_for_back_cond);
cond_wait(back_cond,mutex_for_back_cond);
mutex_unlock(mutex_for_back_cond);
mutex_lock(mutex_for_cond);
if(nThreads==10){
break;
}else{
//spurious wakeup
mutex_unlock(mutex_for_cond);
}
}
//now all threads are waiting
//mutex_for_cond is still locked so broadcast
cond_broadcast(cond);//was type here
}
【问题讨论】:
-
您在此处展示的版本已经存在错误。 (1) 你正在阅读
nThreads而不持有锁。 (2) 在“虚假唤醒”的情况下,您解锁互斥锁两次。 -
而且你的客户端也锁了两次。在尝试引入更多复杂性之前,您可能会尝试整理现有代码。
-
1) nThreads 在哪里不受 mutex_for_cond 保护? 2)mutex_unlock如何在虚假唤醒的情况下被击中两次,while之后没有mutex_unlock(mutex_for_cond。
标签: c++ c multithreading thread-safety pthreads