【发布时间】:2017-01-04 09:44:17
【问题描述】:
我有一个带有 2 个 QThreads 的应用程序,它们的行为类似于下面的伪代码(信号量是 QSemaphore 类型):
Thread1 {
print("about to wait on semaphore 1");
sem1.acquire(1);
print("finished waiting on semaphore 1");
sem2.release(1);
}
Thread2 {
print("signaling semaphore 1");
sem1.release(1);
print("about to wait on semaphore 2");
sem2.acquire(1);
}
问题是当第一个信号量发出信号时第一个线程没有唤醒,即应用程序产生以下输出:
about to wait on semaphore 1
signaling semaphore 1
about to wait on semaphore 2
就是这样。第一个线程不再唤醒。
现在我更改第一个线程以执行以下操作:
Thread1 {
print("about to wait on semaphore 1");
while (!sem1.tryAcquire(1, 200));
print("finished waiting on semaphore 1");
sem2.release(1);
}
在这种情况下,第一个线程在尝试再次获取信号量之前最多休眠 200 毫秒。现在我收到以下错误:
QWaitCondition::wait(): mutex unlock failure: Invalid argument
应用程序不使用其他互斥锁或其他同步原语。可能是什么问题?
更新:
我删除了信号量并将每个信号量替换为 QWaitCondition 和 QMutex,现在它工作得很好。我没有做任何其他更改,我仍然不知道为什么带有信号量的版本不正确。它们都被初始化为0。
【问题讨论】:
标签: multithreading qt synchronization qthread