Tôi đã kiểm tra thư viện tăng cường (phiên bản 1.45) cho một đầu đọc/ghi văn bản. Khi tôi chạy thử nghiệm của tôi trên nó, nó có vẻ như shared_ptr là thích chủ đề đọc của tôi, tức là khi nhà văn của tôi đã cố gắng để khóa cho hoạt động của nó, nó không ngăn chặn bất kỳ lần đọc tiếp theo xảy ra.Boost shared_lock. Đọc ưa thích?
Có thể tăng cường thay đổi hành vi này không?
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;
}
Và đây là kết quả tất cả các thời gian:
làm việc xong công việc của mình
làm việc xong công việc của mình
làm việc xong công việc của mình
làm việc hoàn thành công việc
Grabbed khóa độc quyền của mình, giết chết hệ thống
KILLING TẤT CẢ VIỆC
Yêu cầu của tôi
Nếu nhà văn cố gắng lấy khóa độc quyền, tôi muốn tất cả các thao tác đọc trước đó kết thúc. Và sau đó tất cả các hoạt động đọc tiếp theo để chặn.
Bạn có thể muốn đăng một số mã kiểm tra - Kỹ năng gỡ lỗi tâm linh của tôi là yếu :-) – Bukes