我有一个发布商帖子和一个消费者帖子。他们通过std::stack<Data *>
分享数据。发布者只需按下()指针和消费者只需弹出()指针,使用它并在其上调用delete。由于一次只有一个线程发布指针,而且一个线程消耗指针,是否需要同步堆栈?请记住,堆栈只存储指针。 Publisher仅在Data()完全构造时才推送指针。
答案 0 :(得分:3)
无法在const
命名空间中的非std
容器方法上进行同步是未定义的行为。
push
的基础容器上的pop
和const
都不是stack
。因此,两个线程都写入stack
的基础容器的状态。
一种思考方式是,两者至少都必须争夺stack
中元素数量的计数:一个是试图增加它,另一个是试图减少它。 (还有其他问题,但是应该说服你们两个都写到{{1}}的状态)
答案 1 :(得分:1)
std::stack<Data*>
实例需要同步访问,因为多个线程可以修改它(通过pop()
和push()
),但其中包含的元素不仅仅是单个线程可以在任何时候对元素进行操作。
答案 2 :(得分:1)
是的,需要同步对堆栈的访问,因为std::stack
类不保证任何操作都是原子的,并且可能push()
,top()
和{ {1}}会交错。