[问题] thread safe 观念请教

楼主: lovejomi (JOMI)   2018-06-03 00:07:22
突然想说包装一个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.
有没有在探讨这件事的文章可以让我观念更清楚一点
谢谢
作者: bluesoul (忙死你老爸)   2018-06-03 00:10:00
不要提供reference读到错的东西,资料就乱七八糟了
作者: Schottky (顺风相送)   2018-06-03 00:15:00
读到错的东西,没crash比当场crash更惨一万倍吧接下来就是要抓不知何时发生、为何会发生的古怪bug了
楼主: lovejomi (JOMI)   2018-06-03 01:20:00
stl就提供ref想说终于原版,找一个好的thread safe写法...
作者: firose (guest也是也是也是也是也)   2018-06-03 08:08:00
问题是 ctor 有 by value 的版本吗?copy ctor搞错了抱歉 请跳过我说的
作者: lightyen (lightyen)   2018-06-03 09:15:00
同一楼 不要提供referencemutex直接用就好了 过度的包装反而不容易维护
作者: shadow0326 (非议)   2018-06-03 11:02:00
通常mutex保护的是存取vector的那段code,而不是把整个vector包起来STL container都有iterator或ref invalidate的问题全保护起来就变得超难用,还不如不用
作者: littleshan (我要加入剑道社!)   2018-06-03 16:27:00
C++ container 提供了 ref 就无法做到 thread safe如果你想要两者兼得就不能用 C++,改用 Rust 吧另一个解法是把 ref 改成 proxy object只是效能会变得超级慢
作者: obj   2018-06-07 23:46:00
应该是操作vector的地方用mutex保护起来

Links booklink

Contact Us: admin [ a t ] ucptt.com