我遇到以下问题。如何添加一个项目到两个队列并保证它存在于两者之中(多线程)
我有两个类,在这种情况下,A和B,都拥有concurrent_queue
。这里的假设是concurrent_queue是一个线程安全队列,具有阻塞push()函数。当一个对象在B中入队时,它访问单例A并且它也在A中排队。这样做的结果是一大堆B的队列与他们自己的对象没什么关系,而A中的一个大队列包含了他们。 B的每个实例都可以存在于一个单独的线程中。
我遇到的情况是,线程在B :: foo()中的两行代码之间经常被抢占,这意味着A :: mQueue包含该对象,但B :: mQueue尚未包含物体。
我想知道的是如何确保当调用B :: foo()时,该对象要么被推到两个队列中,要么都不推送到队列中。在我看来,我必须在A中拥有一个互斥体,B才能获得并锁定A的互斥体到B :: foo()中。
有没有人有任何建议,我怎么能做到这一点,或者我如何重组我的代码来完成这个?我正在使用boost ::线程库。
Class A
{
public:
A& instance(){/* return singleton */}
void addToQueue(SomeObject const& obj)
{
mQueue.push(obj);
}
private:
concurrent_queue<SomeObject> mQueue;
};
Class B
{
public:
void foo()
{
SomeObject obj;
//I would like to guarantee that obj is either present in both queues or neither queue
A::instance().addToQueue(obj);
mQueue.push(obj);
}
private:
concurrent_queue<SomeObject> mQueue;
};
在我的实际应用中,它不是被在A和B排队相同的对象,而将A所有排队包含指向B的结构,这让我离队一切都在A和出队B的顺序与排队时相同,但这与问题无关。