多线程之原子操作

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

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;避免了同时访问;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值