2012-11-17 35 views
1

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

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

+1

基本上你需要在列表中使用同步,但要给出合理的答案,很高兴看到你写了什么代码 – Caribou

+0

这可能听起来很愚蠢,但它是面试系统设计问题。我想知道我们是否有某种形式的内置并发机制。感谢您的快速回答。 (现在基本上没有代码进度) –

+0

如果有任何实现'std :: list'的标准库能够在多个*进程之间共享,我会感到惊讶!但是,它们可以通过适当的同步与多个*线程*一起使用。 –

回答

0

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

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

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

This for linux based IPC detailThis for Windows based IPC detail

对于一些参考,你可以使用Boost.Interprocessdocumentation它提供了一个平台独立于实现的IPC机制。

+0

不幸的是,我也在想这样的事情:http://stackoverflow.com/a/8189664/1828115。感谢您的解释。 –

+0

np - 面试的好运... – Caribou

0

标准库容器不提供针对并发修改的automagic保护,因此您需要为队列的每次访问都创建一个全局锁。

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

+0

[这里](https://bitbucket.org/KjellKod/g2log/src/cbe4c5a8bb31dee3459248a55434c76c901454ef/g2log/src/shared_queue.h?at=default)是一个容器的例子,这是受保护的 –

+0

进一步Kerreks答案,如果你的确的意思是多进程,那么你需要看看操作系统中的同步方法。例如在Linux上,你需要考虑诸如'semaphores'(或可能是IPC机制) – Caribou

+2

@DmitryLedentsov:是的,它可以在单个进程中运行,但是OP可能需要一些更复杂的共享内存技术......实际上包括一些方法可以在共享内存中创建标准库列表! –

2

假设你的意思是线程而不是过程可以共享STL容器,但你必须要小心相对于同步。 STL容器在某些程度上是安全的,但您需要了解给定的螺纹安全保证:

  1. 一个容器可以被多个阅读器同时使用。
  2. 如果一个容器有一个作者,则不应该有并发读者或并发作者。
  3. 保证是每个容器,也就是说,线程可以同时使用不同的容器,而不需要它们之间的同步。

这些限制的原因是容器的接口适合在一个线程内有效地使用,并且您不希望妨碍处理可能在线程之间共享的非共享容器。另外,容器接口不适合任何类型的容器维护并发机制。例如,仅仅因为v.empty()刚刚返回false它并不意味着v.pop()工作,因为容器现在可以是空的:如果有内部同步,一旦返回empty(),容器可以被更改pop()叫做。

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

+0

我对'empty()'采取了更激进的看法 - 这种功能在并发容器中毫无意义。并发容器*具有*无大小。你所能做的就是*尝试*检索一个元素,并且你必须处理在这一点上没有任何元素的可能性。 –

+1

@KerrekSB:我认为我们是暴力协议!我刚才描述了为什么与容器接口进行某种内部同步没有任何意义。在思考一下时,很明显,具有内部同步的类只能有一个“失火而忘记”的界面:你向他们抛出一些东西,但你不关心任何特定的结果状态,只是发生了某些特定的事情。 A [* monitor *](http://en.wikipedia.org/wiki/Monitor_(同步))是“火与忘”的更正式描述。 –

+0

@DietmarKühl。谢谢你的解释。它确实有帮助。 –