首页 > 系统相关 >linux网络编程-线程间通信——互斥锁

linux网络编程-线程间通信——互斥锁

时间:2022-12-24 21:55:10浏览次数:40  
标签:item buffer void 间通信 互斥 mutex pthread 线程

为了保证线程在执行某段代码时不被其他线程打断,可以使用互斥锁进行保护,而这段被保护的代码区域被称为临界区。

原理:线程执行锁定函数pthread_mutex_lock()时,如果锁没有被其他线程占用,则获取并占用锁,然后执行自己后面的代码段;此时其他线程无法获取锁,在执行到pthread_mutex_lock()时会休眠,直到占用锁的线程通过pthread_mutex_unlock()把锁释放,才有机会被唤醒并占有锁,然后执行后续代码。

 1 //由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数
 2 //gcc pthread_mutex.c -lpthread -o pthread
 3 #include <stdio.h>
 4 #include <sched.h>
 5 #include <pthread.h>
 6 void *producter_f(void *arg);
 7 void *consumer_f(void *arg);
 8 int buffer_has_item = 0;
 9 pthread_mutex_t mutex;
10 int running = 1;
11 
12 int main(void)
13 {
14     pthread_t consumer_t;
15     pthread_t producter_t;
16     pthread_mutex_init(&mutex, NULL);
17     pthread_create(&producter_t, NULL, (void*)producter_f, NULL);
18     pthread_create(&consumer_t, NULL, (void*)consumer_f, NULL);
19     sleep(5);
20     running = 0;
21     pthread_join(consumer_t, NULL);
22     pthread_join(producter_t, NULL);
23     
24     pthread_mutex_destroy(&mutex);
25 }
26 
27 void *producter_f(void *arg)
28 {
29     while(running)
30     {
31         pthread_mutex_lock(&mutex);
32         printf("生产前,总数量:%d\n", buffer_has_item);
33         buffer_has_item++;
34         printf("生产后,总数量:%d\n", buffer_has_item);
35         pthread_mutex_unlock(&mutex);
36         sleep(1);
37     }
38 }
39 
40 void *consumer_f(void *arg)
41 {
42     while(running)
43     {
44         pthread_mutex_lock(&mutex);
45         printf("消费前,总数量:%d\n", buffer_has_item);
46         buffer_has_item--;
47         printf("消费后,总数量:%d\n", buffer_has_item);
48         pthread_mutex_unlock(&mutex);
49         sleep(1);
50     }
51 }

这段代码输出:

生产前,总数量:0
生产后,总数量:1
消费前,总数量:1
消费后,总数量:0

或者输出:

消费前,总数量:0
消费后,总数量:-1
生产前,总数量:-1
生产后,总数量:0
生产前,总数量:0
生产后,总数量:1


输出结果可能有多种,是由于线程竞争锁的结果是不确定的。但无论哪种结果,临界区内的代码块总是能执行完成而不会被打断。

生产者临界区:

32         printf("生产前,总数量:%d\n", buffer_has_item);
33         buffer_has_item++;
34         printf("生产后,总数量:%d\n", buffer_has_item);

消费者临界区:

45         printf("消费前,总数量:%d\n", buffer_has_item);
46         buffer_has_item--;
47         printf("消费后,总数量:%d\n", buffer_has_item);

标签:item,buffer,void,间通信,互斥,mutex,pthread,线程
From: https://www.cnblogs.com/zzx2bky/p/17003441.html

相关文章

  • Go 快速入门指南 - 互斥锁和定时器
    互斥锁对于任一共享资源,同一时间保证只有一个操作者,这种方法称为 ​​互斥机制​​。关键字 ​​Mutex​​​ 表示互斥锁类型,它的 ​​Lock​​​ 方法用于获取锁,​​U......
  • Servlet生命周期和线程安全
    本文目录​​一、Servlet生命周期​​​​1、生命周期四个阶段​​​​1.1、实例化​​​​1.2、初始化​​​​1.3、服务​​​​1.4、销毁​​​​1.5、Servlet执行流程​......
  • 02.关于线程你必须知道的8个问题(上)
    大家好,我是王有志,欢迎来到《Java面试都问啥?》的第一篇技术文章。这个系列会从Java部分开始,接着是MySQL和Redis的内容,同时会继续更新数据结构与算法的部分,这样在第一阶段,我......
  • 多线程必知必会的知识点
    说说阻塞队列的实现:可以参考ArrayBlockingQueue的底层实现(锁和同步都行);如果队列是空的,消费者会一直等待,当生产者添加元素时候,消费者是如何知道当前队列有元素的呢?如果让你来......
  • 线程通信分解3
    【1】  【2】packagecom.msb.test11;/***@author:liu*日期:15:42:06*描述:IntelliJIDEA*版本:1.0*/publicclassProduct{//商品类//......
  • 多线程
    多线程什么是进程?什么是线程?进程是一个应用程序(1个进程是一个软件)。线程是一个进程中的执行场景/执行单元。一个进程可以启动多个线程。对于java程序来说,当在DOS命令......
  • 【并发技术系列】「多线程并发编程」技术体系和并发模型的基础探究(夯实基础)
    让我们通过本篇文章一同进入并发编程技术的世界里面,相信通过这篇文文章一定会对话你的并发技术体系有一定帮助以及夯实你的基础功底。基本概念并发concurrency并行paralleli......
  • 线程通信问题分解2
    【1】利用同步代码块解决问题packagecom.msb.test10;importcom.sun.media.sound.RIFFInvalidDataException;/***@author:liu*日期:16:02:52*描述:Intel......
  • Java中线程的6种状态详解
    java.lang.Thread.State枚举类中定义了六种线程的状态,可以调用线程Thread中的getState()方法获取当前线程的状态。publicenumState{NEW,RUNNABLE,......
  • 线程通信问题分解1
    packagecom.msb.test10;/***@author:liu*日期:15:42:06*描述:IntelliJIDEA*版本:1.0*/publicclassProduct{//商品类//品牌privateStr......