繁体   English   中英

我怎么知道使用boost在c ++中锁定需要保护的共享变量?

[英]How do I know what shared variables I need to protect with a lock in c++ using boost?

例如,如果互斥锁对多线程访问不具有弹性,则多线程将永远不会工作(例如,两次同时调用mutex.lock()无法解决问题)。

这是否也扩展到条件变量? 具体来说,我想释放一个锁,然后调用cond.notify_one()。 从理论上讲,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。 是否保证这将是良好的行为?

那么在堆上分配的简单数据结构怎么样? 如果只读取数据结构,是否可以允许并发访问,假设数据结构保证不会在读取时自行调整? 是否存在stl数据结构和成员函数允许并发读取而不需要锁定的文档?

您需要同步对任何对象的访问权限

  1. 该对象由多个线程使用
  2. 这些线程中的至少一个可以修改该对象。

有多种方法可以进行同步:锁(互斥)和原子可能是最常用的两种方法,尽管有一些数据结构的无锁实现。

是否有文档说明哪些STL数据结构和成员函数允许并发读取而不需要锁定?

任何const限定的成员函数都应该是安全的。

Herb Sutter撰写了一系列关于有效并发的文章 ,您可能会发现它们很有用。 他讨论了各种设计模式,常见陷阱,锁层次结构和其他并发主题。

如果只读取数据结构,是否可以允许并发访问

是。 只读访问永远不会产生多线程冲突。

互斥和条件变量是“多线程工具链”的一部分,用于实现多线程应用程序。 因此,根据定义,它们是“线程安全的”。

具体来说,我想释放一个锁,然后调用cond.notify_one()。 从理论上讲,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。 是否保证这将是良好的行为?

在这种情况下,您需要在保持互斥锁的情况下操纵条件变量,以避免这种竞争条件。

那么在堆上分配的简单数据结构怎么样?

可以同时安全地访问简单(如在字节缓冲区或C样式结构中)。 任何变异对象都需要同步。

是否存在stl数据结构和成员函数允许并发读取而不需要锁定的文档?

据我所知,标准C ++库包通常不是线程安全的。

从理论上讲,另一个线程可以在通知之前获取锁,并开始自己调用cond.notify_one()。 是否保证这将是良好的行为?

你通常会让其他线程等待条件而不是锁定,但如果你这样做,那么抓住锁定的线程会阻止因抓住锁定而导致胎面被唤醒,并且发出信号的线程将不会继续,而不是它将等待锁定。

这是典型的使用模式: 增强条件

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM