使用 boost::upgrade_lock 和 shared_lock 来实现读/写线程安全

Using boost::upgrade_lock and shared_lock to implement read/write thread safety

本文关键字:lock 安全 实现 线程 shared boost upgrade 使用      更新时间:2023-10-16
double x = 10;
boost::shared_mutex xSharedMutex;

void r() {
    boost::shared_lock<boost::shared_mutex> lock(xSharedMutex);
    for (int i = 0; i < 100; i++) {
        cout << "**** READ **** " << x << endl;
        usleep(200);
    }
}
void w() {
    boost::upgrade_lock<boost::shared_mutex> lock(xSharedMutex);
    for (int i = 0; i < 100; i++) {
        x = i + 12;
        cout << "---- WRITE ---- " << x <<endl;
        usleep(200);
    }
}
int main() {
    boost::thread t1(&r);
    boost::thread t2(&w);
    sleep(3);
}

我希望读取和写入将按顺序进行,因为在 w(( 中添加了upgrade_lock。但是,读取和写入同时运行。

shared_lock和upgrade_lock的使用是错误的吗?如何解决?谢谢。

您需要唯一的所有权才能写入:

boost::unique_lock<boost::shared_mutex> lock(xSharedMutex);
for (int i = 0; i < 100; i++) {
    x = i + 12;
    std::cout << "---- WRITE ---- " << x << std::endl;
    usleep(200);
}

或者,您可以临时升级该锁:

upgrade_lock<shared_mutex> lock(xSharedMutex);
for (int i = 0; i < 100; i++) {
    {
        upgrade_to_unique_lock<shared_mutex> write_lock(lock);
        x = i + 12;
        std::cout << "---- WRITE ---- " << x << std::endl;
    }
    usleep(200);
}

当然,该程序中的输出会混合在一起,因为控制台输出不受任何类型的锁定(这严格来说是 UB(