【C++ 语言】pthread_mutex_t 互斥锁

网友投稿 894 2022-05-30

文章目录

线程同步机制

互斥锁

互斥锁使用示例

线程同步机制引入 : 多个线程读取同一个资源时 , 可能会造成冲突 , 因此需要引入线程同步机制 , 让多个线程按照一定规则对共享的资源进行操作 ;

互斥锁使用流程 : ① 声明互斥锁 , ② 初始化互斥锁 , ③ 加锁 , ④ 解锁 , ⑤ 销毁互斥锁 ;

① 声明互斥锁 ;

pthread_mutex_t mutex_t;

1

② 初始化互斥锁 :

//初始化互斥锁 pthread_mutex_init(&mutex_t, 0);

1

2

③ 加锁 :

//先用互斥锁上锁 pthread_mutex_lock(&mutex_t);

1

2

④ 解锁 :

//操作完毕后, 解锁 pthread_mutex_unlock(&mutex_t);

1

2

⑤ 销毁互斥锁 :

//销毁互斥锁 pthread_mutex_destroy(&mutex_t);

1

2

代码示例 :

#include "005_Thread.h" #include //引入队列的头文件 #include using namespace std; /* 互斥锁 : 声明 : 先声明互斥锁 初始化 : 在进行初始化操作 销毁 : 使用完毕后 , 要将该互斥锁销毁 */ pthread_mutex_t mutex_t; //声明一个队列变量 // 该变量是全局变量 // 该变量要在不同的线程中访问 , 用于展示线程同步 queue que; /* 操作线程方法 : 参数和返回值都是 void* 类型 互斥锁使用 : 多个线程对一个队列进行操作 , 需要使用互斥锁将该队列锁起来 , pthread_mutex_lock 使用完毕后在进行解锁 , pthread_mutex_unlock 该类型的锁与 Java 中的 synchronized 关键字一样 , 属于悲观锁 其作用是通过 mutex 互斥锁 , 将上锁与解锁之间的代码进行同步 */ void* queue_thread_fun(void* args) { //先用互斥锁上锁 pthread_mutex_lock(&mutex_t); if (!que.empty()) { //打印队列中的第一个元素 printf("获取 queue_thread 队列第一个数据 : %d\n", que.front()); //将队列首元素弹出 que.pop(); } else { printf("获取 queue_thread 队列为空\n"); } //操作完毕后, 解锁 pthread_mutex_unlock(&mutex_t); return 0; } /* 如果 8 个线程同时读取队列中的信息 , 会出现程序崩溃 在多线程环境下 , 对队列进 queue_thread 行操作 , queue_thread 是线程不安全的 这里需要加锁 , 进行 线程同步的操作 */ int main() { //初始化互斥锁 pthread_mutex_init(&mutex_t, 0); //向其中加入几个int数据 for (size_t i = 0; i < 5; i++) { que.push(i); } //创建多个线程操作 queue_thread 队列 pthread_t pids[8]; for (size_t i = 0; i < 8; i++) { //创建线程 pthread_create(&pids[i], 0, queue_thread_fun, 0); } //销毁互斥锁 pthread_mutex_destroy(&mutex_t); return 0; }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

【C++ 语言】pthread_mutex_t 互斥锁

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

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

执行结果 :

获取 queue_thread 队列第一个数据 : 0 获取 queue_thread 队列第一个数据 : 1 获取 queue_thread 队列第一个数据 : 2 获取 queue_thread 队列第一个数据 : 3 获取 queue_thread 队列第一个数据 : 4 获取 queue_thread 队列为空 获取 queue_thread 队列为空

1

2

3

4

5

6

7

C++ 任务调度

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:JVM简单个人总结
下一篇:0基础lua学习(二) 数据类型
相关文章