我有一個執行緒A只負責push,另外一個執行緒B只負責判斷是否為空,如果不為空,則取front,然后pop,請問這種應用,會有問題嗎?會有什么問題?
uj5u.com熱心網友回復:
stl庫是非執行緒安全的,需要加鎖或選擇執行緒安全或無鎖佇列uj5u.com熱心網友回復:
如果queue涉及到資料變動,多執行緒就要加鎖。
uj5u.com熱心網友回復:
請教,我上面這個場景,問題出在哪里?uj5u.com熱心網友回復:
stl都是非執行緒安全的uj5u.com熱心網友回復:
謝謝各位老師,我明白這個是非執行緒安全,但是我就是想知道,我這個場景的應用,會出現什么問題?我這個場景,是不是可以規避不安全的情況?uj5u.com熱心網友回復:
push pop顯然會對配接器底層容器元素進行增刪,甚至可能會進行記憶體擴容和指標修改,還會修改一個size值。這一堆處理在多執行緒下需要是原子操作,否則就很可能例外。比如vector,內部有一個指標指向一個堆陣列和一個size還有一個capacity,當你push的時候,會增加一個元素,同時還修改size, size大到不能容納,會觸發記憶體擴容,整體拷貝,釋放原記憶體,修改capacity等待一堆操作,這些都不是原子的,在多執行緒下需要加鎖才行。uj5u.com熱心網友回復:
我覺得可能安全,但我說不出理由。uj5u.com熱心網友回復:
stl非執行緒安全, 也就意味著, 超過一個執行緒同時使用, 就需要加鎖了.你的一寫一讀的場景, 要看具體容器型別, 比如你用的vector.
當你讀執行緒拿到資料準備讀取的時候, 寫執行緒push了, 但發現vector空間不夠, 就會重新分配空間, 并且把原空間釋放.
這時, 你的讀執行緒拿到的資料地址, 就是"野"指標, 然后程式自然就crash.
還有, 當stl容器資料變化時, 迭代器也會失效.
uj5u.com熱心網友回復:
在追求高性能的環境下, 可以用環形佇列實作無鎖的執行緒安全的queue, 但是stl默認不是的, 未來可能出現執行緒安全的uj5u.com熱心網友回復:
push的操作不是原子的,如果在操作程序中執行了執行緒切換,另一個執行緒拿到的是不完整的資料轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/32497.html
標籤:C++ 語言
上一篇:C++做連連看的最后出現這個問題 未經處理的例外0xC0000005: 讀取位置 0x00000068 時發生訪問沖突。
下一篇:C語言VC下的檔案
