25.互斥锁

Posted 喵小喵~

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

以上是关于25.互斥锁的主要内容,如果未能解决你的问题,请参考以下文章

LockSupport.java 中的 FIFO 互斥代码片段

互斥锁 & 共享锁

互斥锁自旋锁读写锁和条件变量

ReentrantReadWriteLock场景应用

25多线程之互斥锁

java中ReentrantReadWriteLock读写锁的使用