测试类用于多线程环境中。Threada询问他是否必须通过调用HastOlait方法(ItestWaiter)来等待线程。当ThreadB完成他的工作时,他通过调用Test :: Notify方法通知所有服务员。
您能告诉我是否有可能发生僵局()方法 - 在零件之间,零件被静置的零件和信号量获取方法锁定?
?struct Semaphore {
bool acquire() { return WaitForSingleObject(sem, INFINITE); }
private:
Handle sem;
};
struct Test
{
bool wait(std::mutex mutex, const ITestWaiter *obj);
bool notify(std::mutex mutex);
private:
std::vector<Semaphore> waiters;
};
bool Test::wait(std::mutex mutex, const ITestWaiter *obj) {
Semaphore* sem;
{
std::unique_lock<std::mutex> mlock(mutex);
if (!obj->hasToWait())
return false;
sem = createSemaphoreAndPushBackToVector();
}
try {
sem->acquire();
}
catch (std::exception e) {}
return true;
}
bool Test::notify(std::mutex mutex) {
std::unique_lock<std::mutex> mlock(mutex);
//notify waiters by releasing the semaphore
return true;
}
从您发布的代码中,应该没有问题:在两种情况下,您都不会在锁定锁定期间阻止;您只需采取一些小动作(一旦修改向量,一旦迭代了它)即可。但是有您没有显示的代码!
首先,有您将如何通知。我假设您使用CreateEvent
获取句柄和SetEvent
以获取通知&ndash;如果是这样,也没问题。
然后,有hasToWait
功能。可疑:您在握住锁时正在打电话!有什么理由吗?hasToWait
也有锁吗?另一线程可能尝试锁定同一设施吗?如果两个线程都不以相同的顺序获取锁,则存在僵局的风险。
如果不涉及单独的锁定,但是hasToWait
需要访问需要由同一静音保护的一些资源,那么代码也可以。
如果没有锁定和没有对共享资源的访问,则首先锁定穆特克斯是徒劳的,只需要时间;在这种情况下,首先检查更有效:
if (obj->hasToWait())
{
Semaphore* sem;
{
std::unique_lock<std::mutex> mlock(mutex);
sem = createSemaphoreAndPushBackToVector();
}
try
{
sem->acquire();
}
catch (std::exception e)
{ }
}