等待方法中可能的僵局情况
Possible deadlock situation in the wait method?
测试类用于多线程环境中。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)
{ }
}
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 等待方法中可能的僵局情况
- 在这种简单的情况下,可能是僵局