Drecik学习经验分享
转载请注明出处:http://blog.csdn.net/drecik__/article/details/8097806
1. 为什么需要线程同步
当应用程序使用多线程时候,很多情况下我们将让多个线程访问某一个共享资源,在访问的时候我们就需要考虑的线程同步的问题,例如下面的代码:咋一看感觉没有什么问题,两个线程函数结束之后g_x为2,但是,有个问题是我们不能知道确切的时候线程在做什么,我们不能知道操作系统什么时候把线程切换掉,所以我只能说g_x结果可能为2,,假设将上面函数代码编译成了下面的汇编代码:long g_x = 0; DWORD CALLBACK ThreadFunc1( LPVOID lpVoid ) { g_x++; return 0; } DWORD CALLBACK ThreadFunc2( LPVOID lpVoid ) { g_x++; return 0; }
如果一个线程先执行后一个线程后执行,那么汇编代码如下: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
此时g_x结果将为1,所以我们应该保持线程的同步,在同一时刻保证只有一个线程访问共享资源,操作系统给我们提供了两种方法,一种是在用户模式下进行线程同步,另一种是在内核模式下进行线程同步。MOV EAX, [g_x] INC EAX MOV EAX, [g_x] INC EAX MOV [g_x], EAX MOV [g_x], EAX
我将会在之后博文中分别介绍。
2. 什么时候需要线程同步
以下两种基本情况下,线程之间需要相互通信,保持同步:
- 需要让多个线程同时访问一个共享资源,同时不能破坏资源的完整性。
- 一个线程需要通知其他线程某项任务已经完成。