我遇到以下問題。如何添加一個項目到兩個隊列並保證它存在於兩者之中(多線程)
我有兩個類,在這種情況下,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的順序與排隊時相同,但這與問題無關。