windows多线程同步机制---原子锁

 原子锁

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

  原理介绍:

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


  问题描述:

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Barry__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值