gpt4 book ai didi

c++ - 等待方法中可能出现死锁情况?

转载 作者:太空宇宙 更新时间:2023-11-04 12:39:35 24 4
gpt4 key购买 nike

测试类用于多线程环境。 ThreadA通过调用hasToWait方法(ITestWaiter)询问他是否必须等待ThreadB。当 ThreadB 完成他的工作时,他通过调用 Test::notify 方法通知所有等待者。

你能告诉我 wait() 方法中是否存在可能的死锁情况 - 在被互斥锁锁定的部分和对信号量获取方法的调用之间?

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;
}

最佳答案

从您发布的代码来看,应该没有问题:在这两种情况下,您在持有锁期间都不会阻塞;你只需做一些小 Action (一次修改 vector ,一次迭代它)。但是有些代码你没有显示!

首先,您将如何通知。我假设您使用 CreateEvent 获取句柄并使用 SetEvent 进行通知 - 如果是这样,也没问题。

然后是 hasToWait 函数。可疑:你在已经持有锁的情况下调用它!有什么理由吗? hasToWait 是否也有一些锁定?其他线程是否可能尝试锁定同一设施?如果两个线程没有以相同的顺序获取锁,则存在死锁的风险。

如果不涉及单独的锁定,但 hasToWait 需要访问一些需要受同一互斥锁保护的资源,那么代码也可以。

如果没有锁定并且无法访问共享资源,那么先锁定互斥锁是徒劳的,只是需要时间;在这种情况下,首先检查效率更高:

if (obj->hasToWait())
{
Semaphore* sem;
{
std::unique_lock<std::mutex> mlock(mutex);
sem = createSemaphoreAndPushBackToVector();
}
try
{
sem->acquire();
}
catch (std::exception e)
{ }
}

关于c++ - 等待方法中可能出现死锁情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54882888/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com