25.互斥锁

  • 创建互斥锁
    1 SRWLOCK g_lock;

    注意一个线程仅能锁定资源一次,不能多次锁定资源

  • 读取期间锁定数据,数据无法被外部线程修改
    1 AcquireSRWLockShared(&g_lock);

     

  • 释放互斥锁
    1 AcquireSRWLockShared(&g_lock);

     

完整代码:(一个进程读,是个进程写,读的时候不能写,写的时候不能读)

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <Windows.h>
 4 
 5 int num = 6400000;
 6 SRWLOCK g_lock;
 7 // 注意一个线程仅能锁定资源一次,不能多次锁定资源
 8 DWORD WINAPI read(void*p)
 9 {
10     AcquireSRWLockShared(&g_lock);//读取期间,锁定数据,数据无法被修改
11     int i = 0;
12     while (1)
13     {
14         Sleep(1000);
15         printf("\n第%d秒num=%d",i, num);
16 
17         if (i==20)
18         {
19             break;
20         }
21         i++;
22     }
23     ReleaseSRWLockShared(&g_lock);
24 
25 }
26 
27 //写数据
28 DWORD WINAPI write(void *p)
29 {
30     AcquireSRWLockExclusive(&g_lock);//锁定写入,
31     printf("\n开始写入");
32     for (int i = 0; i < 100000; i++)
33     {
34         num--;
35     }
36     ReleaseSRWLockExclusive(&g_lock);//
37     printf("\n结束写入");
38 
39 }
40 
41 
42 void main()
43 {
44     InitializeSRWLock(&g_lock);//初始化
45 
46 
47     CreateThread(NULL, 0, read, NULL, 0, NULL);
48 
49 
50     HANDLE hd[64];
51     for (int i = 0; i < 64; i++)
52     {
53         hd[i] = CreateThread(NULL, 0, write, NULL, 0, NULL);
54     }
55 
56     WaitForMultipleObjects(64, hd, TRUE, INFINITE);
57 
58     printf("\n last=%d", num);
59 
60 
61 
62 
63 
64 
65 
66     system("pause");
67 }

 

posted @ 2018-02-03 13:09  喵小喵~  阅读(176)  评论(0编辑  收藏  举报