Re: [問題] thread 和 string

看板C_and_CPP作者 (Bird)時間15年前 (2009/06/04 11:38), 編輯推噓2(209)
留言11則, 4人參與, 最新討論串4/4 (看更多)
※ 引述《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)

06/04 11:39, , 1F
VC6 及以前的 compiler 有實作過, 但是個災難
06/04 11:39, 1F

06/04 11:45, , 2F
er....更正 剛剛測了一下gcc有COW, 抱歉
06/04 11:45, 2F

06/04 11:45, , 3F
不知道是我印像有誤還是版本差異
06/04 11:45, 3F

06/04 11:45, , 4F
我拿gcc 3.4.5測的
06/04 11:45, 4F

06/04 12:12, , 5F
原來只是我踫巧 trace 到的兩個 stdlib 都用 COW :P
06/04 12:12, 5F

06/04 12:18, , 6F
另外, 你說到的情況, 我是覺得非 const 的 operator[]
06/04 12:18, 6F

06/04 12:18, , 7F
要 copy 是很正常吧
06/04 12:18, 7F

06/04 19:06, , 8F
為什麼 copy-on-write 會有問題? 在寫入前他都會先拷貝阿.
06/04 19:06, 8F

06/04 19:06, , 9F
之後就是修改自己的副本了. 比較有問題應是 ref-count 吧?
06/04 19:06, 9F

06/04 19:07, , 10F
在發現 count==0 時, 要 del 前剛好被其他執行緒插斷, 引入
06/04 19:07, 10F

06/04 19:08, , 11F
新的引用~ 但是為時已晚, 切換回原來執行緒照樣把它砍掉
06/04 19:08, 11F
文章代碼(AID): #1A9q6UGJ (C_and_CPP)
文章代碼(AID): #1A9q6UGJ (C_and_CPP)