1

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

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

4

3 回答 3

2

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

  1. 一个容器可以被多个阅读器同时使用。
  2. 如果一个容器有一个写者,则既不能有并发读者,也不能有并发写者。
  3. 保证是针对每个容器的,即线程可以同时使用不同的容器,而无需它们之间的同步。

这些限制的原因是容器的接口是为了在一个线程中高效使用而设计的,并且您不希望阻碍具有跨线程共享潜力的非共享容器的处理。此外,容器接口不适用于任何类型的容器维护并发机制。例如,仅仅因为v.empty()刚刚返回false它并不意味着它v.pop()可以工作,因为容器现在可以是空的:如果有内部同步,任何锁都会在empty()返回后被释放,并且容器可以在pop()调用时更改。

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

于 2012-11-17T19:02:32.823 回答
0

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

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

于 2012-11-17T18:50:55.003 回答
0

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

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

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

有关基于 linux 的 IPC 详细信息, 请参阅此内容 有关基于 Windows 的 IPC 详细信息,请参阅此内容

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

于 2012-11-17T19:09:29.913 回答