我用boost :: upgrade_to_unique_lock / unique_lock&&进行了实验。 boost :: shared_lock,场景是:
1个写线程,它所在的位置 boost :: unique_lock存在于 我在线程中的boost :: shared_mutex 写入全局 AClass
3个读线程,每个都有 boost :: shared_lock与此相同 boost :; shrared_mutex,他们有一个 循环读取全局 AClass
我观察到所有线程同时持有锁(1个唯一,3个共享),而且它们都是 运行数据访问循环。
我的担心是 AClass 不是线程安全的,如果我可以在不同的线程中同时进行读/写,则读取可能会崩溃。即使它不是AClass,我们使用原始类型,读取它们肯定不会崩溃,但数据可能很脏,不是吗?
答案 0 :(得分:3)
boost::shared_lock<boost::shared_mutex>(gmutex);
这不是“未命名的锁定”。这将创建一个临时shared_lock
对象,锁定gmutex
,然后销毁该临时shared_lock
对象,解锁gmutex
。您需要命名对象,使其成为变量,例如:
boost::shared_lock<boost::shared_mutex> my_awesome_lock(gmutex);
my_awesome_lock
将在声明它的块的末尾被销毁,这就是你想要的行为。