windows多线程同步机制---原子锁
2016-02-16 21:27
405 查看
原子锁
执行单个指令时,锁定操作,不允许其他线程访问.(循环执行原子锁运算时,循环过程中也是不允许其他线程访问,直到循环执行完原子操作)原理介绍:
线程执行加减法时,依靠寄存器来计算,切换线程之前,先保存寄存器的值到线程中,再次轮到该线程执行时,把值恢复到寄存器中继续来计算。问题描述:
想通过多线程执行g_nValue++的操作(即累加一个值),线程A通过寄存器完成加法运算,假设g_nValue正在加到10000时,线程切换到B,A的寄存器中保存10000数字,B从10000开始加数据,当B加到15000时,线程切换到A,A恢复寄存器的值,A会继续从10000开始累加,就将B完成5000的加法覆盖.原子锁解决:
原子锁可以保证,在当前线程循环执行原子加/减操作时,其他线程不可以切换,直到当前线程原子操作循环执行完毕。原子运算包括:
InterlockedIncrement ++运算InterlockedDecrement --运算
InterlockedCompareExchange ?运算
// InterLock.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "windows.h" LONG g_nValue1 = 0; LONG g_nValue2 = 0; DWORD WINAPI InterProc1( LPVOID pParam ) { for( int nIndex=0; nIndex<10000000; nIndex++ ) { //普通++ g_nValue1++; } return 0; } DWORD WINAPI InterProc2( LPVOID pParam ) { for( int nIndex=0; nIndex<10000000; nIndex++ ) { //原子锁++(lock) InterlockedIncrement( &g_nValue2 ); } return 0; } void Create( ) { DWORD nThreadID = 0; HANDLE hThread[4] = { NULL }; hThread[0] = CreateThread( NULL, 0, InterProc1, NULL, 0, &nThreadID ); hThread[1] = CreateThread( NULL, 0, InterProc1, NULL, 0, &nThreadID ); hThread[2] = CreateThread( NULL, 0, InterProc2, NULL, 0, &nThreadID ); hThread[3] = CreateThread( NULL, 0, InterProc2, NULL, 0, &nThreadID ); WaitForMultipleObjects( 4, hThread, TRUE, INFINITE ); printf( "Value1=%d Value2=%d\n", g_nValue1, g_nValue2 ); } int main(int argc, char* argv[]) { Create( ); return 0; }
相关文章推荐
- Python多线程同步Lock、RLock、Semaphore、Event实例
- 五种Java多线程同步的方法
- 基于Java回顾之多线程同步的使用详解
- Java 多线程同步 锁机制与synchronized深入解析
- iOS开发多线程同步
- 《Win32多线程程序设计》(3)---同步控制
- 《Win32多线程程序设计》(4)--- 互斥器(Mutexes)
- 《Win32多线程程序设计》(5)---信号量(Semaphores)
- 《Win32多线程程序设计》(6)---事件(Event Objects)
- 《Win32多线程程序设计》(8)---Interlocked Variables
- 《Win32多线程程序设计》(9)---同步机制摘要
- pthread学习笔记
- 原子锁
- 关于同步锁的一个问题
- 多线程同步说明
- 走进windows编程的世界-----windows线程
- 【C/C++多线程编程之八】pthread条件变量
- 网页爬虫中的多线程模式
- Java 多线程同步问题的探究(三、Lock来了,大家都让开【1. 认识重入锁】)
- 经典同步问题之哲学家进餐