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