多线程下的list读写

riyueming184 2020-04-30 05:08:43
先贴下代码

#include <iostream>
#include <list>
#include <thread>
using namespace std;

list<int> l;
bool stop = false;

void TheadFunction()
{
while (true)
{
do
{
if (!l.empty())
{
auto element = l.front();
l.pop_front();
}
else
{
break;
}
} while (true);
if (stop)
{
break;
}
this_thread::sleep_for(chrono::milliseconds(1));
}
}

int main()
{
thread* t = new std::thread(&TheadFunction);
int count = 0;
while (count < 1000000)
{
for (int i = 0;i< 1000;++i)
{
l.push_back(i);
}
this_thread::sleep_for(chrono::milliseconds(1));
count++;
}
stop = true;
if (t->joinable())
{
t->join();
}
delete t;
t = nullptr;
}

环境:windows7,VS2019;linux centos,gcc 6.4.0
问题:这段代码在linux下何在windows下表现不一致:windows下在读线程l.front()出现异常(引发了异常: 读取访问权限冲突。
std::list<int,std::allocator<int> >::front(...) 返回 0xDDDDDDE5。)。linux下没有
是什么原因导致在windows下和linux下表现不同呢?还是说在linux下运气好?
...全文
506 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
吃拉面的小波 2021-11-09
  • 打赏
  • 举报
回复

你好,请问您这个问题解决了吗?我再学习的时候,也是开两个线程对同一个list读写操作,看的教学视频在win上回报错,但是我再linux上不会,现在有点疑惑。

lunatic7 2020-05-03
  • 打赏
  • 举报
回复
auto element = l.front(); l.pop_front(); 我理解的错误的可能性 你读完然后pop掉了 再读和写同时进行的时候 push的位置就是size()+1了
qybao 2020-05-03
  • 打赏
  • 举报
回复
引用 4 楼 riyueming184 的回复:
我就是不想加锁才做测试的,list的push_back不是尾部添加吗?一个线程尾部添加,一个线程在判空之后头部删除。

如果是自己定义的数据结构,也许你可以控制,但是你用的是list类,它的内部结构你了解吗(源码怎么控制的你完全熟悉吗,能避开里面的坑吗)?毕竟增加删除会修改size属性(list的长度),而且可能内部判断list有无元素也用到size属性,所以你不用同步,就有可能破坏内部数据结构的整合性,当然就出问题了。
riyueming184 2020-05-03
  • 打赏
  • 举报
回复
引用 2 楼 arfi 的回复:
既然是多线程,你的锁呢
我就是不想加锁才做测试的,list的push_back不是尾部添加吗?一个线程尾部添加,一个线程在判空之后头部删除。
sdghchj 2020-04-30
  • 打赏
  • 举报
回复
多线程不加锁? 某台机器上不报错,不等于在别的机器上不报错; 某台机器上执行100次不报错,不等于第101次时不报错。
arfi 2020-04-30
  • 打赏
  • 举报
回复
既然是多线程,你的锁呢
riyueming184 2020-04-30
  • 打赏
  • 举报
回复
问题补充:也可能在push_back是出现异常----引发了异常: 写入访问权限冲突。 _Insert_after 是 0xCDCDCDCD

64,670

社区成员

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

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