博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
windows多线程同步机制---原子锁
阅读量:3984 次
发布时间:2019-05-24

本文共 1416 字,大约阅读时间需要 4 分钟。

 原子锁

    执行单个指令时,锁定操作,不允许其他线程访问.(循环执行原子锁运算时,循环过程中也是不允许其他线程访问,直到循环执行完原子操作)
    

  原理介绍:

线程执行加减法时,依靠寄存器来计算,切换线程之前,先保存寄存器的值到线程中,再次轮到该线程执行时,把值恢复到寄存器中继续来计算。

  问题描述:

想通过多线程执行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;}

转载地址:http://xwxui.baihongyu.com/

你可能感兴趣的文章
如何打开ipynb文件
查看>>
[Leetcode BY python ]190. Reverse Bits
查看>>
面试---刷牛客算法题
查看>>
Android下调用收发短信邮件等(转载)
查看>>
Android中电池信息(Battery information)的取得
查看>>
SVN客户端命令详解
查看>>
Android/Linux 内存监视
查看>>
Linux系统信息查看
查看>>
用find命令查找最近修改过的文件
查看>>
Android2.1消息应用(Messaging)源码学习笔记
查看>>
在android上运行native可执行程序
查看>>
Phone双模修改涉及文件列表
查看>>
android UI小知识点
查看>>
Android之TelephonyManager类的方法详解
查看>>
Android 获取屏幕的分辨率
查看>>
android raw读取超过1M文件的方法
查看>>
ubuntu下SVN服务器安装配置
查看>>
MPMoviePlayerViewController和MPMoviePlayerController的使用
查看>>
CocoaPods实践之制作篇
查看>>
[Mac]Mac 操作系统 常见技巧
查看>>