发布者和消费者线程之间的堆栈数据共享

时间:2013-01-31 15:23:12

标签: c++ multithreading concurrency

我有一个发布商帖子和一个消费者帖子。他们通过std::stack<Data *>分享数据。发布者只需按下()指针和消费者只需弹出()指针,使用它并在其上调用delete。由于一次只有一个线程发布指针,而且一个线程消耗指针,是否需要同步堆栈?请记住,堆栈只存储指针。 Publisher仅在Data()完全构造时才推送指针。

3 个答案:

答案 0 :(得分:3)

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

push的基础容器上的popconst都不是stack。因此,两个线程都写入stack的基础容器的状态。

一种思考方式是,两者至少都必须争夺stack中元素数量的计数:一个是试图增加它,另一个是试图减少它。 (还有其他问题,但是应该说服你们两个都写到{​​{1}}的状态)

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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