[問題] thread safe 觀念請教
突然想說包裝一個thread safe的vector
最單純的想法就是把vector常用的api
每一個都用lock_guard<mutext>(mMutex) 保護
但仔細想一個情況
vector的operator[]是回傳 reference的.
reference operator[]( size_type pos );
假設
thread1 寫 Foo f; f = mVec[0]; // 走 operator=(const Foo&)
thread2 寫 無數次的 mVec.push_back(foo);
這時候 thread1的複製動作 我根本無法保證當下reference的object是valid的
我認為很有可能thread2在push_back的時候造成vector的realloc 所以thread1 就read到
莫名其妙的數值
(這邊也想問, "讀取" heap上面而非write 就算被deleted,
會有可能造成除了讀到錯的數值以外的行為產生嗎? 例如crash)
我所能想到的變成
1. 不提供operator[]了 而是提供SetAt(int index, Foo& out) 讓set的動作我內部完全
lock保護
2. 我vector class expose我的mutex給外面用的人lock...但這樣變得一點thread safe
的感覺都沒了
這兩個想法 說真的我從來沒看過... 是我多想了嗎?
還是大多情況就是by value return就好不要弄成reference.
有沒有在探討這件事的文章可以讓我觀念更清楚一點
謝謝
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 27.242.100.195
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1527955644.A.876.html
→
06/03 00:10,
7年前
, 1F
06/03 00:10, 1F
→
06/03 00:11,
7年前
, 2F
06/03 00:11, 2F
推
06/03 00:15,
7年前
, 3F
06/03 00:15, 3F
→
06/03 00:16,
7年前
, 4F
06/03 00:16, 4F
→
06/03 01:20,
7年前
, 5F
06/03 01:20, 5F
→
06/03 01:20,
7年前
, 6F
06/03 01:20, 6F
→
06/03 08:08,
7年前
, 7F
06/03 08:08, 7F
→
06/03 08:10,
7年前
, 8F
06/03 08:10, 8F
→
06/03 08:12,
7年前
, 9F
06/03 08:12, 9F
推
06/03 09:15,
7年前
, 10F
06/03 09:15, 10F
→
06/03 09:19,
7年前
, 11F
06/03 09:19, 11F
推
06/03 11:02,
7年前
, 12F
06/03 11:02, 12F
→
06/03 11:02,
7年前
, 13F
06/03 11:02, 13F
→
06/03 11:03,
7年前
, 14F
06/03 11:03, 14F
→
06/03 11:04,
7年前
, 15F
06/03 11:04, 15F
推
06/03 16:27,
7年前
, 16F
06/03 16:27, 16F
→
06/03 16:28,
7年前
, 17F
06/03 16:28, 17F
→
06/03 16:29,
7年前
, 18F
06/03 16:29, 18F
→
06/03 16:29,
7年前
, 19F
06/03 16:29, 19F
推
06/07 23:46,
7年前
, 20F
06/07 23:46, 20F