等待方法中可能的僵局情况

Possible deadlock situation in the wait method?

本文关键字:僵局 情况 方法 等待      更新时间:2023-10-16

测试类用于多线程环境中。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)
    { }
}