【问题标题】:Multiple reads and single write - threadsafe?多读单写-线程安全?
【发布时间】:2012-10-15 09:07:41
【问题描述】:

我有一个数据结构,它有两种访问方法:query() 和 modify()。多个线程可以同时使用 query(),但只有一个线程可以进入 modify(),同时所有使用 query() 的线程都必须退出,然后才能在 modify() 上进行访问。

在 C++ 中使这种数据结构线程安全的最佳方法是什么?

(我阅读了 boost 读/写锁定,但有人告诉我它可能比使用互斥锁慢 3-40 倍)

【问题讨论】:

  • 首先尝试最简单的解决方案——使用互斥锁保护所有访问。 99.5% 的时间,这将是令人满意的,你的工作就会完成。 (如果一个线程不可能尝试修改对象,而另一个线程正在或可能正在访问它,则不需要锁定。这假设您的读取不会以任何方式修改对象。)跨度>
  • 这取决于modify 中发生的情况。读取和写入部分保护的全部意义在于阻止读取在更改中途时无效。仅保护modify 函数将无法实现这一点。但是,如果您只保护单个数据类型,例如 int 或指针,我相信这可以。但是,我想编写一个极其残酷的测试程序来验证这一点。
  • fwiw,对于快速进出锁,互斥锁(至少在 win32/64 上)将比暴击秒慢得多。如果您要跨越流程边界,那么您别无选择,但如果您的单流程考虑它是一种选择。我敢肯定 Linux 人员解决了这个问题,至少比windoze 做得更好。

标签: c++ multithreading thread-safety


【解决方案1】:

一般来说,您应该使用互斥锁来保护共享数据。

但如果您共享数据的类型是整数,您也可以考虑使用std::atomic,这通常比锁定互斥锁快得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-11
    • 1970-01-01
    • 2012-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多