【发布时间】:2011-04-04 12:54:54
【问题描述】:
我似乎在使用 pthreads 条件变量时遇到了可能的死锁。
这里是代码
thread function(){
for (condition){
do work
/* should the thread continue? */
if (exit == 1){
break; /* exit for */
}
} /* end for */
pthread_mutex_lock(&mtxExit);
exit = 0;
pthread_cond_signal(&condVar);
pthread_mutex_unlock(&mtxExit);
}
主要功能如下:
function main(){
if (thread is still active){
pthread_mutex_lock(&mtxExit);
exit = 1;
pthread_mutex_unlock(&mtxExit);
} /* end if */
while (exit == 1){
pthread_mutex_lock(&mtxExit);
/* check again */
if (exit == 1)
pthread_cond_wait(&condVar, &mtxExit);
pthread_mutex_unlock(&mtxExit);
}
create new thread()
....
}
代码总是卡在 cond_wait 上。 :(
编辑:
让我在线程中添加一些说明以解释我在做什么。
在任何给定时间,我只需要运行一个线程。我有一个启动线程的函数,告诉它要做什么,主线程继续它的工作。
下一次主线程决定它需要生成另一个线程时,它必须确保之前启动的线程已经退出。我不能同时让两个线程处于活动状态,因为它们会相互干扰。这是设计和我正在处理的问题的定义。
这就是我遇到问题的地方。
这是我的方法:
启动线程,让它完成它的工作。
线程检查其工作的每一步以查看它是否仍然相关。这就是“退出”出现的地方。主线程将“exit”设置为 1,如果它需要告诉线程它不再相关。
在大多数情况下,线程将在主线程决定生成另一个线程之前退出。但是我仍然需要考虑到主线程准备好启动另一个线程时线程仍然处于活动状态的情况。
所以主线程设置了“exit”的值,需要等待线程退出。我不想将 pthread_kill 与 0 一起用作信号,因为这样主线程将处于循环中浪费 CPU 周期。我需要主线程放弃控制并休眠/等待线程退出。
由于我一次只需要一个线程,我不需要担心扩展到更多线程。解决方案永远不会有多个线程。我只需要一个可靠的机制来测试我的线程是否还活着,如果是,则发出信号退出,等待它退出并启动下一个。
从我的测试来看,即使线程可能已经退出或者信号根本没有传递到主线程,主线程仍在输入条件变量。它永远在那里等待。在某些情况下,在调试器中我看到 exit 的值设置为 0 并且主线程仍在等待信号。某些地方似乎存在竞争条件。
我不喜欢我现在如何设置代码,它太乱了。它现在只是一个概念证明,我将很快转向更好的解决方案。我的挑战是可靠地通知线程退出,等待它退出。
感谢您的宝贵时间。
【问题讨论】:
-
你是在多处理器(注意:不一定是多核)机器上吗?
-
另外,
exit是如何声明的? -
exit 是一个全局变量。我在多核、多线程、多 CPU 系统上运行。是的,这三个都成立。
-
对您的回答来说不是一个问题,但是如果您的要求是完全顺序的行为,为什么还要使用线程?
-
不,它不是顺序行为。有两个并行的控制流。
标签: c pthreads race-condition