私のプログラムはデッドロックしていますが、私はデバッガで実行するとそれができないので、最初の疑いがrwLockなので、なぜ私は自分のバージョンを書いたのでしょうか?ライブラリ - 私は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'を減らす機会を与えることは決してありません。私にコピー/ペーストのエラーのように見える - 私は 'notify_all'ではなく' condition.wait'をここに入れることを意味すると確信しています –
@IgorTandetnik私は別のウェブサイトからこれをコピーして修正しました。私はラインが問題だと感じましたが、どちらの状況も正直言って私には意味がありません。 –
'shared_timed_mutex'はC++で存在します14 – Yakk