リーダー/ライターロックのブーストライブラリ(バージョン1.45)をチェックしていました。テストを実行したとき、shared_ptrがリーダースレッドを優先しているように見えました。つまり、ライターがその操作のためにロックを取得しようとしたときに、後続の読み取りの発生が停止しませんでした。
ブーストでこの動作を変更することは可能ですか?
using namespace std;
using namespace boost;
mutex outLock;
shared_mutex workerAccess;
bool shouldIWork = true;
class WorkerKiller
{
public:
void operator()()
{
upgrade_lock<shared_mutex> lock(workerAccess);
upgrade_to_unique_lock<shared_mutex> uniqueLock(lock);
cout << "Grabbed exclusive lock, killing system" << endl;
sleep(2);
shouldIWork = false;
cout << "KILLING ALL WORK" << endl;
}
private:
};
class Worker
{
public:
Worker()
{
}
void operator()()
{
shared_lock<shared_mutex> lock(workerAccess);
if (!shouldIWork) {
outLock.lock();
cout << "Workers are on strike. This worker refuses to work" << endl;
outLock.unlock();
} else {
sleep(1);
outLock.lock();
cout << "Worked finished her work" << endl;
outLock.unlock();
}
}
};
int main(int argc, char* argv[])
{
Worker w1;
Worker w2;
Worker w3;
Worker w4;
WorkerKiller wk;
boost::thread workerThread1(w1);
boost::thread workerThread2(w2);
boost::thread workerKillerThread(wk);
boost::thread workerThread3(w3);
boost::thread workerThread4(w4);
workerThread1.join();
workerThread2.join();
workerKillerThread.join();
workerThread3.join();
return 0;
}
そして、これが毎回の出力です:
仕事は彼女の仕事を
終えた仕事は彼女の仕事を終えた仕事は彼女の仕事を終えた
仕事
は彼女の仕事を終えた
排他的なロックをつかみ、システムを殺す
すべての仕事を殺す
私の要件
ライターが排他ロックを取得しようとした場合は、以前のすべての読み取り操作を終了してください。そして、その後のすべての読み取り操作をブロックします。