关于STL线程的问题

slmax1 2016-09-12 11:12:36
我知道STL是线程不安全的

比如我有两个线程对同一个list对象做push_back操作.压入的数据只是一个指针.
除去数据不同步的隐患之后(根本不需要数据同步),

在这种情况下,会不会因为在某个时刻,两个线程同时push_back,一个线程刚压入2个字节,
后一个线程抢夺过去,压入另一个指针导致数据紊乱,或者程序崩掉.

其实问题说得简单点就是.push_back是不是原子操作.
...全文
122 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiqiang01234 2016-09-12
  • 打赏
  • 举报
回复
引用 楼主 csshow 的回复:
我知道STL是线程不安全的 比如我有两个线程对同一个list对象做push_back操作.压入的数据只是一个指针. 除去数据不同步的隐患之后(根本不需要数据同步), 在这种情况下,会不会因为在某个时刻,两个线程同时push_back,一个线程刚压入2个字节, 后一个线程抢夺过去,压入另一个指针导致数据紊乱,或者程序崩掉. 其实问题说得简单点就是.push_back是不是原子操作.
stl的容器都不是线程安全的,需要自己做同步保护
赵4老师 2016-09-12
  • 打赏
  • 举报
回复
《Windows核心编程》
hijack00 2016-09-12
  • 打赏
  • 举报
回复
你可以搜一下stl中的vector是否是线程安全的。 http://zhidao.baidu.com/link?url=-GkCaxFdLLYMfdAr7bAA7ptKAM0W5SLKW0ZBpkVfRfSckAJAaQ5W4w6rZRWUlGHRMvok4EDFr9oGM073Lit1f_
fefe82 2016-09-12
  • 打赏
  • 举报
回复
不是。 除了有明确说明的(std::atomic等),就不再有原子操作了。包括 i++ 都(应该认为)不是原子的。
Qlaiaqu 2016-09-12
  • 打赏
  • 举报
回复
所谓线程安全,说的是数据的多线程访问安全性。一个操作,会不会被打断,是其是否是原子操作的判断标准。
encoderlee 版主 2016-09-12
  • 打赏
  • 举报
回复
既然知道不是线程安全的,那么就要加锁访问
paschen 版主 2016-09-12
  • 打赏
  • 举报
回复
肯定不是原子操作 另多个线程同时push肯定要加锁
lm_whales 2016-09-12
  • 打赏
  • 举报
回复
push_back 不仅仅是 把 数据写入 容器内,内部还有很多操作 例如,更改 数据长度(vector) 创建新的节点(list) 等等,这些操作对程序员是透明的 这意味着,你的程序,不能修改容器的实现, 在多线程中,如果不同步的话, 这会造成混乱,也许仅仅是一瞬间,一旦出问题,很难再现
小灸舞 2016-09-12
  • 打赏
  • 举报
回复
不是线程安全,记得加锁

64,683

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧