可以在不同步的情况下在不同的线程上使用std :: deque :: push_back()和std :: deque :: front()/ std :: deque :: pop_front()吗?

时间:2014-04-09 16:35:23

标签: c++ multithreading stl

我有单一生产者和单一消费者的生产者/消费者情况,共享一个共同的std :: deque。

让我写一些代码:

deque<int> dq;

void producer()
{
for (int i = 0; i < N; i++)
   dq.push_back(i);
   // signal data
}

void consumer()
{
  // get signal
  int n = dq.front();
  dq.pop_front();
}

考虑在独立线程上执行的consumer()和producer()。这段代码需要同步吗?

2 个答案:

答案 0 :(得分:2)

如果您没有在读者和作者之间进行同步,则可能会出现数据损坏。

所以答案一般是否定的。

requote

  

多个读者是安全的。多个线程可以同时读取   单个容器的内容,这将正常工作。   当然,不得有任何作家在集装箱上行事   在阅读期间。

根据环境的不同,您可以使用不同的并发容器。例如,MSDN支持concurrent queue并且有boost个库也提供lock free containers

答案 1 :(得分:0)

通常,,您的代码不是线程安全的。

请参阅MSVC的相关文档(“C ++标准库中的线程安全”):

  

如果一个线程正在写入一个对象,那么所有读取   并且必须在相同或其他线程上写入该对象   保护。例如,给定对象A,如果线程1正在写入   A,然后必须阻止线程2读取或写入A。

GCC(“Concurrency&gt; Containers”)

  

[...]锁定必须几乎总是在容器外面完成   客户代码(那就是你,而不是我们)。

C ++标准(即使是C ++ 11标准)也没有强制要求线程安全访问。如果你使用其他编译器,它的文档肯定会告诉你类似的关于容器类的并发访问。