Windows核心编程学习笔记(16)--线程同步

Drecik学习经验分享

转载请注明出处:http://blog.csdn.net/drecik__/article/details/8097806

 

1. 为什么需要线程同步

当应用程序使用多线程时候,很多情况下我们将让多个线程访问某一个共享资源,在访问的时候我们就需要考虑的线程同步的问题,例如下面的代码:
long g_x = 0;
DWORD CALLBACK ThreadFunc1( LPVOID lpVoid )
{
	g_x++;
	return 0;
}

DWORD CALLBACK ThreadFunc2( LPVOID lpVoid )
{
	g_x++;
	return 0;
}
咋一看感觉没有什么问题,两个线程函数结束之后g_x为2,但是,有个问题是我们不能知道确切的时候线程在做什么,我们不能知道操作系统什么时候把线程切换掉,所以我只能说g_x结果可能为2,,假设将上面函数代码编译成了下面的汇编代码:
MOV EAX, [g_x]
INC EAX
MOV [g_x], EAX
如果一个线程先执行后一个线程后执行,那么汇编代码如下:
MOV EAX, [g_x]
INC EAX
MOV [g_x], EAX

MOV EAX, [g_x]
INC EAX
MOV [g_x], EAX
此时将得到正确的结果,但是当一个线程执行到一半的时候,系统切换到另一个线程则可能的代码将如下:
MOV EAX, [g_x]
INC EAX

MOV EAX, [g_x]
INC EAX
MOV [g_x], EAX

MOV [g_x], EAX
此时g_x结果将为1,所以我们应该保持线程的同步,在同一时刻保证只有一个线程访问共享资源,操作系统给我们提供了两种方法,一种是在用户模式下进行线程同步,另一种是在内核模式下进行线程同步。
我将会在之后博文中分别介绍。

2. 什么时候需要线程同步

以下两种基本情况下,线程之间需要相互通信,保持同步:
  • 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。
  • 一个线程需要通知其他线程某项任务已经完成。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值