2013-01-31 35 views
0

我有一個發佈者線程和一個消費者線程。他們通過std::stack<Data *>共享數據。發佈者只需push()指針和消費者只需彈出()指針,使用它並調用delete就可以了。由於一次只有一個線程發佈指針,而一個線程使用指針,是否需要同步堆棧?請記住,堆棧僅存儲指針。僅當Data()完全構造時,Publisher纔會推入指針。通過發佈者和消費者線程之間的堆棧共享數據

+0

是的,你必須同步。 'push()'和'pop()'不是原子操作。 – juanchopanza

回答

3

未能在非const上同步容器的方法std命名空間中的未定義行爲。

對於stack的底層容器,pushpop都不是const。所以兩個線程都寫入stack的底層容器的狀態。

想想看,這兩種方法至少都必須爭取stack中元素數的計數:一個試圖增加它,另一個試圖減少它。 (還有其他問題,但是應該讓你相信兩者都寫入了stack的狀態)

1

std::stack<Data*>實例將需要訪問多於一個線程同步,可以(經由pop()push())被修改,但不作爲只有一個線程可以被一個元件上的任何一個操作包含的元素時間。

1

是的,有必要同步訪問堆棧,因爲std::stack類不保證任何操作是原子的,這是可能的,即push()top()pop()將交錯。