c++ - 我这里需要读写锁吗

标签 c++ multithreading thread-safety mutex

我正在编写多线程代码。我不确定我是否需要读写锁机制。您能否通过用例并告诉我是否必须使用读写锁或仅使用普通的互斥锁就可以。

用例: 1) 有两个变量的类。在执行操作之前,每个线程都会访问这些。 2) 当出现问题时,更新这些变量以反射(reflect)错误场景。 因此读取这些变量的线程可以做出不同的决定(包括中止)

这里,第二点,我需要更新数据。首先,每个线程都会使用数据。所以,我的问题是我是否必须在更新数据时使用写锁并在读取数据时使用读锁。 (注意:两个变量都在内存中。只是一个 bool 标志和字符串)

我很困惑,因为我的两个变量都在内存中。操作系统在完整性时也会注意。我的意思是当某个线程在互斥量中写入数据时,我可以忍受 1 或 2 个线程丢失更新值。

请问我说的对还是错?也请告诉我是否必须使用读写锁或者只是普通的互斥锁就可以了。

更新:很抱歉,我没有提供平台和编译器名称。我在 RHEL 5.0 上并使用 gcc 4.6。我的平台是 x86_64。但我不希望我的代码是特定于操作系统的,因为我们很快就会将代码移植到 Solaris 10。

最佳答案

首先,忽略那些谈论 volatile 的其他回答者。 Volatile is almost useless for multithreaded programming ,而它所给予的任何错误的安全感都是 - 错误的。

现在,您是否需要锁定取决于您对这些变量的处理方式。您至少需要一个内存屏障(锁意味着一个)。

让我们举个例子:

  • 一个标志是错误标志。如果为零,则继续,否则中止。
  • 另一个标志是诊断代码标志。它给出了错误的确切原因。

在这种情况下,一种选择是执行以下操作:

  • 在没有锁的情况下读取错误标志,但在读取后有读取内存屏障。
  • 发生错误时,获取锁,设置诊断代码和错误标志,然后释放锁。如果已设置诊断代码,请立即解锁。

需要内存屏障,否则编译器(或 CPU!)可能会选择为每次读取缓存相同的结果。

当然,如果你的两个变量的语义不同,答案可能会有所不同。您需要更具体一些。

请注意,指定锁和内存屏障的确切机制取决于编译器。 C++0x 提供了一种可移植的机制,但很少有编译器完全实现 C++0x 标准。请指定您的编译器和操作系统以获得更详细的答案。

至于你的输出数据,你几乎肯定需要一个锁。不过,请尽量避免过于频繁地使用这些锁,因为过多的锁争用会降低您的性能。

关于c++ - 我这里需要读写锁吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6698332/

相关文章:

c - 在 Linux 内核中, spin_lock_irqsave() 是否可以保护我免受信号处理程序、页面错误、schedule() 调用的影响?

仅适用于开发环境的 Python 应用程序多线程

java - 使用双重检查锁定实现读写锁

java - 使用 Java 锁时出现竞争条件的可能性

c++ - 嵌套 While 循环运行次数超出预期

c++ - 没有从 long unsigned int 到 long unsigned int& 的转换

c++ - 将unique_ptr vector 分配给 vector C++

c++ - OpenGL 实例化渲染不工作,只出现一个实例

java - 这段代码是线程安全的吗?

Java线程设计