推送元素以列出STL C ++的多个进程

时间:2012-11-17 18:35:55

标签: c++ concurrency stl multiple-processes

我有多个preforked服务器进程,它接受修改服务器上共享STL C ++列表的请求。每个进程只是在列表末尾推送一个新元素并返回迭代器。

我不确定每个进程应该如何尝试获取列表中的锁?它应该是整个对象还是能够处理并发性的STL列表,因为我们只是在列表的末尾推送一个元素?

3 个答案:

答案 0 :(得分:2)

假设你的意思是线程而不是进程,你可以共享STL容器,但是你需要注意同步。 STL容器在某种程度上是安全的线程,但您需要了解给出的线程安全保证:

  1. 多个读者可以同时使用一个容器。
  2. 如果某个容器有一个编写器,则既不应该是并发读者也不是并发编写者。
  3. 保证是每个容器,即线程可以同时使用不同的容器,而不需要它们之间的同步。
  4. 这些限制的原因是容器的接口适合在一个线程内有效使用,并且您不希望阻止非共享容器的处理,并且可能跨线程共享。此外,容器接口不适用于任何类型的容器维护并发机制。例如,仅仅因为v.empty()刚刚返回false,这并不意味着v.pop()有效,因为容器现在可以为空:如果有内部同步,则任何锁定都会被释放一次empty()返回,并且可以在调用pop()时更改容器。

    创建一个用于不同线程之间通信的队列相对容易。它将使用std::mutexstd::condition_variable的合适实例。我认为有类似的东西被提议包含在标准中,但它还不是标准C ++库的一部分。但请注意,这样的类会向插入元素返回一个迭代器,因为当你访问它时,该元素可能会再次消失,并且使用迭代器是多么有问题无论如何。

答案 1 :(得分:0)

标准库容器不提供针对并发修改的自动保护,因此您需要为队列的每次访问提供全局锁定。

您甚至必须小心迭代器或列表元素的引用,因为您可能不一定知道何时从列表中删除了相应的元素。

答案 2 :(得分:0)

在多个进程之间执行此类同步的机制要求开发人员处理多个问题。首先,需要在它们之外设置流程之间共享的任何内容。这在实践中通常意味着使用shared memory

然后,这些进程需要在访问共享内存方面相互通信。毕竟,如果一个线程开始处理正在共享的数据结构,但在完成操作之前被换出,则会使数据不一致。

这种同步可以使用操作系统结构(如linux中的信号量)完成,并允许竞争进程进行协调。

参见This for linux based IPC detailThis for Windows based IPC detail

对于某些参考,您可以使用Boost.Interprocess documentation,它提供独立于平台的IPC机制实现。