我有多个preforked服务器进程,它接受修改服务器上共享STL C ++列表的请求。每个进程只是在列表末尾推送一个新元素并返回迭代器。
我不确定每个进程应该如何尝试获取列表中的锁?它应该是整个对象还是能够处理并发性的STL列表,因为我们只是在列表的末尾推送一个元素?
答案 0 :(得分:2)
假设你的意思是线程而不是进程,你可以共享STL容器,但是你需要注意同步。 STL容器在某种程度上是安全的线程,但您需要了解给出的线程安全保证:
这些限制的原因是容器的接口适合在一个线程内有效使用,并且您不希望阻止非共享容器的处理,并且可能跨线程共享。此外,容器接口不适用于任何类型的容器维护并发机制。例如,仅仅因为v.empty()
刚刚返回false
,这并不意味着v.pop()
有效,因为容器现在可以为空:如果有内部同步,则任何锁定都会被释放一次empty()
返回,并且可以在调用pop()
时更改容器。
创建一个用于不同线程之间通信的队列相对容易。它将使用std::mutex
和std::condition_variable
的合适实例。我认为有类似的东西被提议包含在标准中,但它还不是标准C ++库的一部分。但请注意,这样的类不会向插入元素返回一个迭代器,因为当你访问它时,该元素可能会再次消失,并且使用迭代器是多么有问题无论如何。
答案 1 :(得分:0)
标准库容器不提供针对并发修改的自动保护,因此您需要为队列的每次访问提供全局锁定。
您甚至必须小心迭代器或列表元素的引用,因为您可能不一定知道何时从列表中删除了相应的元素。
答案 2 :(得分:0)
在多个进程之间执行此类同步的机制要求开发人员处理多个问题。首先,需要在它们之外设置流程之间共享的任何内容。这在实践中通常意味着使用shared memory
。
然后,这些进程需要在访问共享内存方面相互通信。毕竟,如果一个线程开始处理正在共享的数据结构,但在完成操作之前被换出,则会使数据不一致。
这种同步可以使用操作系统结构(如linux中的信号量)完成,并允许竞争进程进行协调。
参见This for linux based IPC detail 见This for Windows based IPC detail
对于某些参考,您可以使用Boost.Interprocess
documentation,它提供独立于平台的IPC机制实现。