请问 我自己定义一个函数 怎么才能保证这个函数是一个原子操作函数
时间:2011-12-22
来源:互联网
在一个线程里我对一个map类型的容器进行了插入,而在另一个线程里对这个容器进行迭代
map<int,int> nMap;
DWORD WINAPI ThreadFunc1(LPVOID pParam)
{
nMap.insert(make_pair(1,2));
...
}
DWORD WINAPI ThreadFunc2(LPVOID pParam)
{
map<int,int>::iterator iter;
for(iter=nMap.begin();iter!=nMap.end();iter++)
{
...
}
...
}
假如我定义了这个迭代器后,在遍历的过程中,线程突然切换了,执行了插入操作,然后再回到ThreadFunc2接着遍历,这时候这个迭代器岂不是会出问题吗?
作者: HappyCodeFly 发布时间: 2011-12-22
单CPU执行一条指令,好像是原子的,我不确定啊啊啊啊啊啊
多线程切换,你加锁就可以了啊,要么把这个函数做成同步 不就完事了啊啊啊啊啊啊
作者: gykgod 发布时间: 2011-12-22
作者: woshiwaiwai 发布时间: 2011-12-22
不可能把,函数本来就有多条汇编指令。
单CPU执行一条指令,好像是原子的,我不确定啊啊啊啊啊啊
多线程切换,你加锁就可以了啊,要么把这个函数做成同步 不就完事了啊啊啊啊啊啊
加锁是有点复杂的,如果不对容器做更新,是可以有多个线程同时迭代容器的,这个该怎么做到?我的是多CPU
作者: HappyCodeFly 发布时间: 2011-12-22
加锁是有点复杂的,如果不对容器做更新,是可以有多个线程同时迭代容器的,这个该怎么做到?我的是多CPU
在线等解决的办法
作者: HappyCodeFly 发布时间: 2011-12-22
作者: dahuaixiaohuai 发布时间: 2011-12-22
作者: nice_cxf 发布时间: 2011-12-22
在函数入口处加锁,这个函数对于再多的线程都成了原子操作。
大哥,你别误导人好不,什么叫原子操作,原子操作要么不执行,要么执行了就执行完。加锁了不一定就是原子操作,加锁了,在执行的过程中这个操作也可能停下来而跳转到另一个线程。
作者: HappyCodeFly 发布时间: 2011-12-22
显然要加锁,就算你写操作是原子操作,读显然不可能是原子操作,一样会有问题。如果读操作很多,写较少可使用读写锁,不过windows系统下没有现成的读写锁,可以在网络上搜一下,很多这种源码
多谢6楼的兄弟,原来我的这个需求是正是读写锁可以解决的问题
作者: HappyCodeFly 发布时间: 2011-12-22
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28