您的位置:首页 > 其它

线程同步——用户模式下线程同步——Interlocked实现线程同步

2014-08-16 10:57 441 查看
线程同步分为用户模式下的线程同步和内核对象的线程同步。

当然用户模式下的线程同步实现速度比内核模式下快,但是功能也有局

//1.利用原子访问:  Interlocked系列函数,关于Interlocked系列函数,我需要知道的是他们,执行的极快

//(1)首先是InterlockedExchangeAdd兄弟函数,
//第一个参数 Addend 代表进行操作数的地址,
//第二个参数 Value 代表增加的值,如果是想进行减法,传负数即可

LONG InterlockedExchangeAdd(
LONG volatile *Addend,
LONG Value ) ;

LONG InterlockedExchangeAdd64(
LONG64 volatile *Addend,
LONG64 Value );
//(2)还有其它3个Interlocked函数

LONG InterlockedExchange(
LONG volatile *Target,
LONG Value ) ;

LONGLONG InterlockedExchange64(
LONG64 volatile *Target,
LONG64 Value );

PVOID InterlockedExchangePointer(
PVOID volatile *Target,
PVOID Value );

//InterlockedExchange 和 InterlockedExchangePointer
//会把第一个参数所指向的内存地址的当前值,以原子方式替换为第二个参数指定的值

//(3)最后的另个Interlocked交换函数
PLONG InterlockedCompareExchange(
LONG volatile *Destination,
LONG Exchange,
LONG Comperand ) ;

PLONG InterlockedCompareExchangePointer(
PVOID volatile *Destination,
PVOID Exchange,
PVOID Comperand ) ;
//函数执行的伪代码
{
if (Destination == Comperand )
{
Destination = Exchange ;
}
}
//函数会将当前值Destination与参数Comparand进行比较,如果两个值相同,
//那么函数会将*Destination 修改为Exchange,否则Destination保值不变

//实现旋转锁时,InterlockedExchange及其有用
//下面演示一下旋转锁
BOOL g_fResourceInUse = FALSE   ;
void Func1()
{
//等待接收资源
while(InterlockedExchange(&g_fResourceInUse,TRUE) == TRUE )
Sleep(0);

//接收资源

//我们不在需要接收资源
InterlockedExchange(&g_fResourceInUse,FALSE) ;
}

#include "windows.h"
#include "iostream"
using namespace std;
long g_x = 0 ;

//定义线程函数1
DWORD WINAPI ThreadFunOne(PVOID pvParam) ;

//定义线程函数2
DWORD WINAPI ThreadFunTwo(PVOID pvParam);

int main()
{
//创建线程1
HANDLE hThreadOne = CreateThread(NULL,0,ThreadFunOne,0,0,NULL);
CloseHandle(hThreadOne);

//创建线程2
HANDLE hThreadTwo = CreateThread(NULL,0,ThreadFunTwo,0,0,NULL);
CloseHandle(hThreadTwo);

//让主线程先挂起,确保其它线程执行完成
Sleep(10000);
cout<<g_x<<endl;
return 0 ;
}

DWORD WINAPI ThreadFunOne(PVOID pvParam)
{
InterlockedExchangeAdd(&g_x,1) ;
return 0;
}

DWORD WINAPI ThreadFunTwo(PVOID pvParam)
{
InterlockedExchangeAdd(&g_x,1) ;
return 0;
}

限性,所以我们在利用线程同步时应先考虑用户模式下的线程同步
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐