windows多线程同步--临界区
推荐参考博客:秒杀多线程第五篇 经典线程同步 关键段CS
关于临界区的观念,一般操作系统书上面都有。
适用范围:它只能同步一个进程中的线程,不能跨进程同步。一般用它来做单个进程内的代码快同步,效率比较高
windows中与临界区有关的结构是 CRITICAL_SECTION,关于该结构体的内部结构可参考here
使用时,主线程中要先初始化临界区,最后要删除临界区,具体使用见下面代码:
从一个例子来说明:假设有三个线程都需要使用打印机,我们可以把打印的代码放到临界区,这样就可以保证每次只有一个线程在使用打印机。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45 |
#include<string> #include<iostream> #include<process.h> #include<windows.h> using
namespace std; //定义一个临界区 CRITICAL_SECTION g_cs; //线程绑定的函数返回值和参数是确定的,而且一定要__stdcall unsigned __stdcall threadFun( void
*param) { EnterCriticalSection(&g_cs); //进入临界区,如果有其他线程则等待 cout<<*(string *)(param)<<endl; LeaveCriticalSection(&g_cs); //退出临界区,其他线程可以进来了 return
1; } int
main() { //初始化临界区 InitializeCriticalSection(&g_cs); HANDLE
hth1, hth2, hth3; string s1 = "first" , s2 = "second" , s3 = "third" ; //创建线程 hth1 = ( HANDLE )_beginthreadex(NULL, 0, threadFun, &s1, 0, NULL); hth2 = ( HANDLE )_beginthreadex(NULL, 0, threadFun, &s2, 0, NULL); hth3 = ( HANDLE )_beginthreadex(NULL, 0, threadFun, &s3, 0, NULL); //等待子线程结束 WaitForSingleObject(hth1, INFINITE); WaitForSingleObject(hth2, INFINITE); WaitForSingleObject(hth3, INFINITE); //一定要记得关闭线程句柄 CloseHandle(hth1); CloseHandle(hth2); CloseHandle(hth3); //删除临界区 DeleteCriticalSection(&g_cs); } |
【版权声明】转载请注明出处:http://www.cnblogs.com/TenosDoIt/p/3601308.html
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。