作者yzugsr (Bird)
看板C_and_CPP
標題Re: [問題] thread 和 string
時間Thu Jun 4 11:38:04 2009
※ 引述《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