+ -
当前位置:首页 → 问答吧 → 请问 我自己定义一个函数 怎么才能保证这个函数是一个原子操作函数

请问 我自己定义一个函数 怎么才能保证这个函数是一个原子操作函数

时间:2011-12-22

来源:互联网

我知道有一对函数:InterLockedIncrement/InterLockedDecrement,好像他们只能对基本类型进行操作。但如果我的函数中对stl容器进行了操作,比如:
在一个线程里我对一个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

引用 1 楼 gykgod 的回复:
不可能把,函数本来就有多条汇编指令。

单CPU执行一条指令,好像是原子的,我不确定啊啊啊啊啊啊

多线程切换,你加锁就可以了啊,要么把这个函数做成同步 不就完事了啊啊啊啊啊啊

加锁是有点复杂的,如果不对容器做更新,是可以有多个线程同时迭代容器的,这个该怎么做到?我的是多CPU

作者: HappyCodeFly   发布时间: 2011-12-22

引用 3 楼 happycodefly 的回复:
加锁是有点复杂的,如果不对容器做更新,是可以有多个线程同时迭代容器的,这个该怎么做到?我的是多CPU

在线等解决的办法

作者: HappyCodeFly   发布时间: 2011-12-22

在函数入口处加锁,这个函数对于再多的线程都成了原子操作。

作者: dahuaixiaohuai   发布时间: 2011-12-22

显然要加锁,就算你写操作是原子操作,读显然不可能是原子操作,一样会有问题。如果读操作很多,写较少可使用读写锁,不过windows系统下没有现成的读写锁,可以在网络上搜一下,很多这种源码

作者: nice_cxf   发布时间: 2011-12-22

引用 5 楼 dahuaixiaohuai 的回复:
在函数入口处加锁,这个函数对于再多的线程都成了原子操作。

大哥,你别误导人好不,什么叫原子操作,原子操作要么不执行,要么执行了就执行完。加锁了不一定就是原子操作,加锁了,在执行的过程中这个操作也可能停下来而跳转到另一个线程。

作者: HappyCodeFly   发布时间: 2011-12-22

引用 6 楼 nice_cxf 的回复:
显然要加锁,就算你写操作是原子操作,读显然不可能是原子操作,一样会有问题。如果读操作很多,写较少可使用读写锁,不过windows系统下没有现成的读写锁,可以在网络上搜一下,很多这种源码

多谢6楼的兄弟,原来我的这个需求是正是读写锁可以解决的问题

作者: HappyCodeFly   发布时间: 2011-12-22