在c ++中,在线程之间共享数据容器的最佳方法是什么

unr*_*nal 3 c++ multithreading c++11

我有一个应用程序有几个处理级别,如:

InputStream->Pre-Processing->Computation->OutputStream
Run Code Online (Sandbox Code Playgroud)

每个实体都在单独的线程中运行.所以在我的代码中我有一般的线程,它拥有

std::vector<ImageRead> m_readImages;
Run Code Online (Sandbox Code Playgroud)

然后它将此成员变量传递给每个线程:

InputStream input{&m_readImages};
std::thread threadStream{&InputStream::start, &InputStream};
PreProcess pre{&m_readImages};
std::thread preStream{&PreProcess::start, &PreProcess};
...
Run Code Online (Sandbox Code Playgroud)

并且每个类都拥有此数据的指针成员:

std::vector<ImageRead>* m_ptrReadImages;
Run Code Online (Sandbox Code Playgroud)

我还定义了一个全局互斥锁,我在对该共享容器的每次读/写操作时锁定和解锁.困扰我的是这种机制非常模糊,有时我会混淆数据是否被另一个线程使用.

那么在这些线程之间共享这个容器的更直接的方法是什么?

Jod*_*cus 7

您描述为"输入 - >预处理 - >计算 - >输出"的过程是按顺序设计的:每个步骤都依赖于前一个步骤,因此以这种特定方式并行化并不是有益的,因为每个线程只需要等待另一个去完成.试着找出哪个步骤需要花费大部分时间并将其并行化.或者尝试设置多个并行处理流水线,这些流水线按顺序在独立的单个数据集上运行.通常的方法是使用处理队列,该队列在一组线程中分配任务.