windows多线程同步机制---原子锁
来源:互联网 发布:网络电玩游戏 编辑:程序博客网 时间:2024/05/22 17:17
原子锁
执行单个指令时,锁定操作,不允许其他线程访问.(循环执行原子锁运算时,循环过程中也是不允许其他线程访问,直到循环执行完原子操作)
原理介绍:
线程执行加减法时,依靠寄存器来计算,切换线程之前,先保存寄存器的值到线程中,再次轮到该线程执行时,把值恢复到寄存器中继续来计算。
问题描述:
想通过多线程执行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;}
0 0
- windows多线程同步机制---原子锁
- windows多线程同步机制
- windows多线程同步机制---事件
- windows多线程同步机制---信号量
- windows多线程同步机制---互斥量
- 内核的同步机制(原子锁)
- windows下线程同步方式(原子锁)
- windows多线程--原子操作
- windows多线程--原子操作
- windows多线程同步机制---临界区
- windows多线程同步机制---可等候定时器
- 多线程并发编程之原子变量与非阻塞同步机制
- windows 多线程之原子性
- Linux内核的同步机制:原子操作
- Linux内核的同步机制:原子操作
- 内核同步机制——原子操作
- Linux内核的同步机制:原子操作
- 原子变量和非阻塞同步机制
- GDKOI模拟 Manufactoria
- libcurl库进行http通讯-开篇
- Java基本类型和取值范围
- ios开发小技巧
- WF4.0和BookMark
- windows多线程同步机制---原子锁
- 浅析计算机接口技术
- struts2 零配置代码
- Excel大小写转换函数
- MD5值 计算_
- 使用JavaScript实现下拉菜单的效果
- Struts2 零配置文件
- Linux操作文件命令
- JZOJ 4224.食物