STL的list容器仅这样操作的两个线程是否是安全的?

opticssim 2012-12-11 03:24:53
请教大家,仅这样操作的两个线程是否是安全的:
std::list<CData*> m_listTab;
std::list<CData*>::iterator iter;
thread1()
{
while(1)
{
for(iter = m_listTab.begin();
iter!= m_listTab.end();
iter++)
{
CData* pData=*iter;
//...
}
}
}
thread2()
{
while(1)
{
CData* pData = new CData();
plistMgr->m_listTab.push_back(pData);
//...
}
}
在thread1中只做遍历和读写节点内容的操作;
在thread2中只做push_back新节点的操作。
没读STL源码,请问仅这样操作的两个线程处理过程中数据是否是安全呀。
谢谢!
...全文
1426 45 打赏 收藏 转发到动态 举报
写回复
用AI写文章
45 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
引用 44 楼 healer_kx 的回复:
[quote=引用 43 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 healer_kx 的回复:] [quote=引用 41 楼 zhao4zhong1 的回复:] [quote=引用 38 楼 healer_kx 的回复:] [quote=引用 37 楼 zhao4zhong1 的回复:] 《30天自制操作系统》
你累了?[/quote] 意思是让帖主彻底了解多线程的本质。[/quote] 不需要搞到操作系统那个层面。。。[/quote] 楼或桥塌了是没必要每次都研究构造楼或桥用的钢筋、水泥、沙子;但有时候就得研究构造楼或桥用的钢筋、水泥、沙子。[/quote] 嗯,你说得对,有时候研究沙子,水泥,钢筋还是不够的,是不是应该研究一下方法论和世界观呢?[/quote] 那当然。任何问题首先是哲学问题。参考《骇客帝国》
healer_kx 2013-09-27
  • 打赏
  • 举报
回复
引用 43 楼 zhao4zhong1 的回复:
[quote=引用 42 楼 healer_kx 的回复:] [quote=引用 41 楼 zhao4zhong1 的回复:] [quote=引用 38 楼 healer_kx 的回复:] [quote=引用 37 楼 zhao4zhong1 的回复:] 《30天自制操作系统》
你累了?[/quote] 意思是让帖主彻底了解多线程的本质。[/quote] 不需要搞到操作系统那个层面。。。[/quote] 楼或桥塌了是没必要每次都研究构造楼或桥用的钢筋、水泥、沙子;但有时候就得研究构造楼或桥用的钢筋、水泥、沙子。[/quote] 嗯,你说得对,有时候研究沙子,水泥,钢筋还是不够的,是不是应该研究一下方法论和世界观呢?
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
引用 42 楼 healer_kx 的回复:
[quote=引用 41 楼 zhao4zhong1 的回复:] [quote=引用 38 楼 healer_kx 的回复:] [quote=引用 37 楼 zhao4zhong1 的回复:] 《30天自制操作系统》
你累了?[/quote] 意思是让帖主彻底了解多线程的本质。[/quote] 不需要搞到操作系统那个层面。。。[/quote] 楼或桥塌了是没必要每次都研究构造楼或桥用的钢筋、水泥、沙子;但有时候就得研究构造楼或桥用的钢筋、水泥、沙子。
healer_kx 2013-09-27
  • 打赏
  • 举报
回复
引用 41 楼 zhao4zhong1 的回复:
[quote=引用 38 楼 healer_kx 的回复:] [quote=引用 37 楼 zhao4zhong1 的回复:] 《30天自制操作系统》
你累了?[/quote] 意思是让帖主彻底了解多线程的本质。[/quote] 不需要搞到操作系统那个层面。。。
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
引用 38 楼 healer_kx 的回复:
[quote=引用 37 楼 zhao4zhong1 的回复:] 《30天自制操作系统》
你累了?[/quote] 意思是让帖主彻底了解多线程的本质。
xiaolomg 2013-09-27
  • 打赏
  • 举报
回复
非线程安全的,自己做同步吧
zybjtu 2013-09-27
  • 打赏
  • 举报
回复
果断加锁。不然你end()这个不好判断。如果读得快,写的慢,读end()了,写还在继续
healer_kx 2013-09-27
  • 打赏
  • 举报
回复
引用 37 楼 zhao4zhong1 的回复:
《30天自制操作系统》
你累了?
赵4老师 2013-09-27
  • 打赏
  • 举报
回复
《30天自制操作系统》
wxtwine2 2013-09-26
  • 打赏
  • 举报
回复
会 core
赵4老师 2013-09-22
  • 打赏
  • 举报
回复
引用 21 楼 opticssim 的回复:
[quote=引用 20 楼 zhao4zhong1 的回复:] 《Windows核心编程》 《深入解析Windows操作系统-Windows Internals》
您是说这些书会讲解这个问题?好像不是STL相关吧?我本意是想利用下那个容器类可能存在的“实现方式不同”,来不加锁来处理我的需求的,ri_aje说的很好,学习了。但好像结论仍然不明确。。。您有何高见,还请不吝赐教。[/quote] 不了解操作系统线程管理和调度,仅在C/C++语言和STL层面能用好多线程?
lm_whales 2013-09-22
  • 打赏
  • 举报
回复
1)一般高级语言代码,对应若干条汇编指令。 所以基本上,不能保证高级语言的语句是原子操作。 线程调度,是通过中断来完成的,所以只有原子操作,才不会被打断。 2)现代CPU很多都是多核的,所以线程不同步时,完全没法保证,不会同时操作同一内存(变量,指针等等)。 3)很多变量,都不是一个字节的,所以即使原子操作,也未必就是安全的,所以同步几乎是必需的。
forsouthc 2013-09-21
  • 打赏
  • 举报
回复
一年后的我遇到了与LZ同样的状况,不知楼主最后怎么做的,感谢各位的讨论!2013年9月21日 21:07:07
opticssim 2012-12-15
  • 打赏
  • 举报
回复
引用 22 楼 jrry7 的回复:
stl 和自己写的数据结构没什么区别。你自己写的链表,如果追加不会影响到前面的读取,那可以侥幸安全。但本质都是不安全的,安全也是碰巧侥幸而已。
谢谢回复。我没读过STL的源码,不是很清楚这个情况。一般的在链表末尾追加链表项,在没有进行链表删除时,都是不会影响前面链表元素的读取的。问题在于:正如ri_age说明的那个顺序,如果STL实现的顺序是先对链表节点的指针赋值为新元素的指针,再将新new出的链表节点接入到链表中,就不会出现问题(对于我不关心是否可以立即轮询到这个新节点的条件下)。这应该不算“侥幸”的安全,而是“确定”的安全吧?就我看来,所谓的安全都会有条件或需要付出高昂的代价(锁操作可能对我的需求而言有点高昂)。所以我希望利用这个“侥幸”。。。如果有谁了解STL源码的过程说说就好了。
FancyMouse 2012-12-15
  • 打赏
  • 举报
回复
引用 29 楼 opticssim 的回复:
引用 26 楼 FancyMouse 的回复:想要利用侥幸,这种代码能通过code review?您说的对!万一是leader要求这么干呢?或许这个leader该杀,呵呵。。。
那就应该讨论啊。把两种方法的pros cons全列出来看到底该怎么做,最后总是一方说服另一方。这基本工作方法不用别人教吧。 leader犯错也是正常的,能说服人家或者被他说服都是可以的结果。对着干这算个什么事。
opticssim 2012-12-15
  • 打赏
  • 举报
回复
引用 27 楼 zhuyf87 的回复:
我觉得不用多想,乖乖的自己添加线程同步吧。-_-
好像的确是个找砖的贴:)。。。呵呵。
opticssim 2012-12-15
  • 打赏
  • 举报
回复
引用 26 楼 FancyMouse 的回复:
想要利用侥幸,这种代码能通过code review?
您说的对!万一是leader要求这么干呢?或许这个leader该杀,呵呵。。。
opticssim 2012-12-15
  • 打赏
  • 举报
回复
引用 25 楼 stereoMatching 的回复:
可能是我多虑了,其实list的效率在大部分情况下都很低(cache hit) 尤其是在c++11引入了rvalue reference的今天 list的执行效率相比起vector又显得更低了 各大经典的资料结构课本都忽略了cache hit的问题 除非你要存的资料形态相当大(例如1024KByte或更高) 否则list的执行效率都不比单纯的vector快 ……
谢谢回复!我的资料形态的确比较大,采用list肯定优于vector。C++11是个好东西。但我没用过,我想对我这种老家伙而言,可能它不会是我应用的主流。谢谢您提供的资料。编译器版本的改变的确会有很大影响,虽然通常不大改这个。我在profile之前就希望利用“侥幸”进行细节的优化,主要还是对系统实现的实时性没有把握。您说的对,我可能是错了。
zhuyf87 2012-12-15
  • 打赏
  • 举报
回复
我觉得不用多想,乖乖的自己添加线程同步吧。-_-
FancyMouse 2012-12-15
  • 打赏
  • 举报
回复
想要利用侥幸,这种代码能通过code review?
加载更多回复(25)

64,654

社区成员

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

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