0

我有一个发布者线程和一个消费者线程。他们通过std::stack<Data *>. 发布者只需 push() 指针,消费者只需 pop() 指针,使用它并在其上调用 delete。既然只有一个线程一次发布一个指针,一个线程消费指针,那还需要同步栈吗?请记住,堆栈仅存储指针。Publisher 仅在 Data() 完全构造时推送指针。

4

3 回答 3

3

未能const在命名空间中的容器的非方法上同步std是未定义的行为。

也不在pusha的底层容器上。所以两个线程都在写入.popconststackstack

一种思考方式是,至少两者都将不得不争夺 中元素的数量stack:一个试图增加它,另一个试图减少它。(还有其他问题,但应该让你相信两者都在写入 的状态stack

于 2013-01-31T15:32:31.477 回答
1

std::stack<Data*>实例需要同步访问,因为多个线程可以修改它(通过pop()push()),但其中包含的元素不会,因为任何时候只有一个线程可以对元素进行操作。

于 2013-01-31T15:26:38.290 回答
1

是的,需要同步对堆栈的访问,因为std::stack类不保证任何操作都是原子的,并且可能push()top()交错pop()

于 2013-01-31T15:26:43.377 回答