【发布时间】:2015-10-30 17:50:46
【问题描述】:
我尝试处理我的代码中的死锁,但我不知道如何防止它。我有一个访问数据的线程和一个更新数据的更新方法。代码如下所示:
thread {
forever {
if (Running) {
LOCK
access data
UNLOCK
}
Running = false;
}
}
update {
Running = false;
LOCK
access data
UNLOCK
Running = true;
}
我尝试使用第二个访问变量来修复它,但它并没有改变任何东西。
thread {
forever {
if (!Updating) {
if (Running) {
LOCK
access data
UNLOCK
}
}
Running = false;
}
}
update {
Updating = true;
Running = false;
LOCK
access data
UNLOCK
Updating = false;
Running = true;
}
感谢您的帮助。
更新 这是对问题的更好描述:
thread {
forever {
if (Running) {
LOCK
if (!Running) leave
access data
UNLOCK
}
Running = false;
}
}
update {
Running = false;
LOCK
access data
UNLOCK
Running = true;
}
我的更新函数有点复杂,所以我看不到为此使用标准算法之一的方法。
更新 2 这是简化的 c++ 源代码。也许将其作为伪代码阅读会更好:
void run() {
forever {
if (mRunning) {
QMutexLocker locker(&mMutex);
for (int i; i < 10; i++) {
qDebug("run %d", i);
sleep(1);
if (!mRunning) break;
}
mRunning = false;
}
}
}
void update() {
mRunning = false;
QMutexLocker locker(&mMutex);
qDebug("update");
mRunning = true;
}
更新 3 行。问题有点复杂。我忘了我在线程中的访问数据部分也开始了一些子线程来填充数据结构
datathread {
access data
}
thread {
forever {
if (Running) {
LOCK
if (!Running) leave
forloop
start datathread to fill data to accessdata list
UNLOCK
}
Running = false;
}
}
update {
Running = false;
LOCK
access data
UNLOCK
Running = true;
}
【问题讨论】:
-
谢谢。我已经阅读了这篇文章,也搜索了它。
-
如果我在我的第一个示例中添加一个
sleep(1)在我的永远循环后面,那么一切都会正常工作。 -
@adapto
Updating = true;和Updating = false;也应该是原子操作。Running状态可能也需要相同的条件。 -
在使用单个互斥锁的代码中不可能出现死锁(除非您尝试在已经拥有它的代码中加锁)。你到底是什么问题?
标签: c++ qt concurrency deadlock