【发布时间】:2023-03-17 13:30:02
【问题描述】:
我的程序死锁了,我不知道为什么,因为当我在调试器中运行它时它不会这样做,所以我的第一个怀疑是我的 rwLock,我编写了自己的版本,因为我只想使用标准库——我认为直到 C++17 才包含 rwLock——这不是我通常做的事情。
class RwLock
{
std::mutex mutex;
std::unique_lock<std::mutex> unique_lock;
std::condition_variable condition;
int reading_threads;
bool writing_threads;
public:
RwLock();
~RwLock();
void read_lock();
void read_unlock();
void write_lock();
void write_unlock();
};
RwLock::RwLock() :
mutex(),
unique_lock(mutex, std::defer_lock),
condition(),
reading_threads(0),
writing_threads(false)
{
}
RwLock::~RwLock()
{
//TODO: find something smarter to do here.
write_lock();
}
void RwLock::read_lock()
{
unique_lock.lock();
while(writing_threads)
{
condition.wait(unique_lock);
}
++reading_threads;
unique_lock.unlock();
}
void RwLock::read_unlock()
{
unique_lock.lock();
if(--reading_threads == 0)
{
condition.notify_all();
}
unique_lock.unlock();
}
void RwLock::write_lock()
{
unique_lock.lock();
while(writing_threads)
{
condition.wait(unique_lock);
}
writing_threads = 1;
while(reading_threads)
{
condition.notify_all();
}
unique_lock.unlock();
}
void RwLock::write_unlock()
{
unique_lock.lock();
writing_threads = 0;
condition.notify_all();
unique_lock.unlock();
}
【问题讨论】:
-
while(reading_threads) { condition.notify_all(); }如果有读者,那将永远等待。您永远不会解锁锁,因此永远不会让读者有机会减少reading_threads。对我来说似乎是一个复制/粘贴错误 - 我敢打赌你的意思是condition.wait,而不是notify_all -
@IgorTandetnik 我从另一个网站复制并修改了它,所以是的。我觉得线路是问题所在,但老实说,这两种情况对我来说都没有多大意义。
-
shared_timed_mutex存在于 C++14 中