线程安全:从单个const源读取多个线程

时间:2016-05-26 14:32:40

标签: c++ multithreading thread-safety

对于线程安全性和未定义行为在多线程从单个源中读取的情况下,我应该关注什么呢?

我正在研究一种允许并行执行独立进程的信号处理模型,这些进程可以共享一个输入缓冲区,但填充输入缓冲区的进程将始终在可能并行进程的下一阶段执行之前完成

在这种情况下,我是否需要担心线程安全问题?我该怎么办呢?

我想指出,如果可能的话,无锁解决方案是最好的

2 个答案:

答案 0 :(得分:2)

  

但填充输入缓冲区的进程将始终在可能并行进程的下一阶段执行之前完成

如果这是有保证的,那么从const对象的不同线程中读取多个就没有问题。

我没有官方标准,因此以下内容来自n4296

  

17.6.5.9避免数据竞争

     

3 C ++标准库函数不得直接或间接修改线程可访问的对象(1.10)   除了当前线程之外,除非通过函数的非const直接或间接访问对象   争论,包括这个。

     

4 [注意:这意味着,例如,实现不能将静态对象用于内部目的而不用   同步,因为即使在未明确共享对象的程序中,它也可能导致数据竞争   线程之间。 - 后注]

以下是Herb Sutter video我在C ++ 11标准中首次了解const的含义。 (见7:00到10:30左右)

答案 1 :(得分:1)

不,你没事。来自同一个常量源的多次读取都可以,并且不会对我所知的所有线程模型(即Posix和Windows)造成任何风险。

然而,

  

但填充输入缓冲区的过程将始终完成

这里的保证是什么?你怎么知道这是这样的?你有同步吗?