多线程之原子操作

来源:互联网 发布:西安软件行业 编辑:程序博客网 时间:2024/04/30 10:32

原子操作:执行过程不被打断;(要么不执行,要么执行完成)

linux上面支持32位数据,但是atomic_t(原子类型数据,类似于int)类型的数据只有24位是存放的数据,8位是锁,用来避免数据并发访问。(浪费了一部分

的存储空间,但是相对于其他复杂的锁机制,对系统的开销小,对高速缓存行影响也小)

linux内核也提供了一系列的原子位操作接口。详细内容可以参考(linux内核设计)

 

                                                               (图片来自:linux内核设计)

原子操作用的比较多的应该是计数器;

volatile long loadNum = 0;
const int threadNum = 51;

DWORD WINAPI increment(void *){
 Sleep(10);
 loadNum++;
// InterlockedIncrement(&loadNum); //原子操作
 Sleep(10);
 return 0;
}

void test(){
 int num = 110;//建议数字大点,数字小了可能看不到效果
 while(num--){
 loadNum = 0;
 HANDLE handle[threadNum];
 for(int i = 0; i < threadNum; i++){
  handle[i] = CreateThread(NULL, 0, increment, NULL, 0, NULL);//创建线程;(CreateThread与_beginthreadex本质区别
 }
 WaitForMultipleObjects(threadNum, handle, true, INFINITE);
 cout << "登陆人数:" << loadNum << endl;
 }
}

环境:win7 vs2010;(原子操作linux和windows原理差不多。)

不用原子操作:会出现loadNum 小于51的情况;

用原子操作:打印结果都是51;避免了同时访问;

 

0 0