看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《adrianshum (Alien)》之銘言: : 我所知大部份 STL 的 string implementation 都是用 COW的. 不是吧 至少VC8, VC9, gcc(SGI)下內建的STL我都trace過 都是full copy而不是copy on write 在C++上要依std::string規格實作copy on write其實很複雜 std::string a = "abcde"; std::string b = a; // 內部使用COW? char* pc = &(b[2]); //沒有write, 傳出raw pointer前要Copy嗎? *pc = "Z"; // 現在呢? 不是無解,要Proxy class或operator[]就copy之類的.... 做了也不一定比較快 : 所以, 問題不在於 "new" 是不是 thread safe etc. : 當然, COW 如果有做適當的 synchronization 也是 thread safe 的. : 對於原 po 的問題, 萬一你用的是 VC++ 6 的話 (後來的 version 我沒有 : 留意了), 的確會有 race condition, 當年工作時因為踫到問題, trace 過 : string 部份的 code 發現的. 萬一你真的剛巧就是用 VC++ 6, 強烈建議轉 : 用別的 STL implementation (STL Port, Apache Std Lib 等) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.124.99.126 ※ 編輯: yzugsr 來自: 59.124.99.126 (06/04 11:39)
Ebergies:VC6 及以前的 compiler 有實作過, 但是個災難 06/04 11:39
yzugsr:er....更正 剛剛測了一下gcc有COW, 抱歉 06/04 11:45
yzugsr:不知道是我印像有誤還是版本差異 06/04 11:45
yzugsr:我拿gcc 3.4.5測的 06/04 11:45
adrianshum:原來只是我踫巧 trace 到的兩個 stdlib 都用 COW :P 06/04 12:12
adrianshum:另外, 你說到的情況, 我是覺得非 const 的 operator[] 06/04 12:18
adrianshum:要 copy 是很正常吧 06/04 12:18
firose:為什麼 copy-on-write 會有問題? 在寫入前他都會先拷貝阿. 06/04 19:06
firose:之後就是修改自己的副本了. 比較有問題應是 ref-count 吧? 06/04 19:06
firose:在發現 count==0 時, 要 del 前剛好被其他執行緒插斷, 引入 06/04 19:07
firose:新的引用~ 但是為時已晚, 切換回原來執行緒照樣把它砍掉 06/04 19:08