原子操作:执行过程不被打断;(要么不执行,要么执行完成)
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;避免了同时访问;