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

linux网络编程-线程——通过信号控制互斥锁

时间:2022-12-25 11:47:26浏览次数:40  
标签:printf void linux 互斥 线程 pthread mutex SIGTERM 数量

 1 //由于pthread库不是Linux系统默认的库,连接时需要使用库libpthread.a,所以在使用pthread_create创建线程时,在编译中要加-lpthread参数
 2 //gcc pthread_sig_mutex.c -lpthread -D_GNU_SOURCE -o pthread
 3 #include <stdio.h>
 4 #include <signal.h>
 5 #include <sched.h>
 6 #include <pthread.h>
 7 void *producter_f(void *arg);
 8 void *consumer_f(void *arg);
 9 int buffer_has_item = 0;
10 pthread_mutex_t mutex;
11 int running = 1;
12 
13 static void sig_handle(int signo)
14 {
15     switch(signo)
16     {
17     case SIGTERM:
18     printf("收到信号SIGTERM, value = %d\n", signo);
19     //释放锁    
20     pthread_mutex_unlock(&mutex);
21     break;
22         
23     default:
24     printf("收到其他信号,value=%d\n", signo);
25     break;
26     }
27     return;
28 }
29 
30 int main(void)
31 {
32     pthread_t consumer_t;
33     pthread_t producter_t;
34     pthread_mutex_init(&mutex, NULL);
35     pthread_create(&producter_t, NULL, (void*)producter_f, NULL);
36     pthread_create(&consumer_t, NULL, (void*)consumer_f, NULL);
37 
38     sighandler_t ret;
39     ret = signal(SIGTERM, sig_handle);
40     if(SIG_ERR==ret)
41     {
42         printf("为SIGTERM挂接信号处理函数失败\n");
43         return -1;
44     }
45     printf("开始监听信号...\n");
46 
47 
48 
49     //等待线程结束
50     pthread_join(consumer_t, NULL);
51     pthread_join(producter_t, NULL);
52     
53     pthread_mutex_destroy(&mutex);
54 }
55 
56 void *producter_f(void *arg)
57 {
58     while(running)
59     {
60         pthread_mutex_lock(&mutex);
61         printf("生产前,总数量:%d\n", buffer_has_item);
62         buffer_has_item++;
63         printf("生产后,总数量:%d\n", buffer_has_item);
64         //pthread_mutex_unlock(&mutex);
65         sleep(1);
66     }
67 }
68 
69 void *consumer_f(void *arg)
70 {
71     while(running)
72     {
73         pthread_mutex_lock(&mutex);
74         printf("消费前,总数量:%d\n", buffer_has_item);
75         buffer_has_item--;
76         printf("消费后,总数量:%d\n", buffer_has_item);
77         //pthread_mutex_unlock(&mutex);
78         sleep(1);
79     }
80 }

编译:gcc pthread_sig_mutex.c -lpthread -D_GNU_SOURCE -o pthread

执行:./pthread

测试:打开新终端,执行pkill -15 pthread

结果:

$ ./pthread
开始监听信号...
消费前,总数量:0
消费后,总数量:-1
收到信号SIGTERM, value = 15
生产前,总数量:-1
生产后,总数量:0
收到信号SIGTERM, value = 15
消费前,总数量:0
消费后,总数量:-1
收到信号SIGTERM, value = 15
生产前,总数量:-1
生产后,总数量:0
收到信号SIGTERM, value = 15
消费前,总数量:0
消费后,总数量:-1
收到信号SIGTERM, value = 15
生产前,总数量:-1
生产后,总数量:0

标签:printf,void,linux,互斥,线程,pthread,mutex,SIGTERM,数量
From: https://www.cnblogs.com/zzx2bky/p/17003811.html

相关文章

  • linux 中实现批量讲指定的行替换为特定的数据
     001、sed实现[root@PC1test4]#lsa.txtcoordinate.txt[root@PC1test4]#cata.txt##测试数据ddffsd1ssaaee2xxvvzz3ssw......
  • Linux C语言程序设计(微课视频版)
     LinuxC语言程序设计(微课视频版) 主编:张同光 出版单位:清华大学出版社 ISBN: ISBN: 出版时间:2023.6 CIP: 内容简介本书以“学完C语言之后知道能做什么”为编写目标,共包括......
  • Linux网络基础
    网络就是把分布在不同地理位置上的主机,通过传输介质(网线、卫星等)连接起来,实现主机之间数据传输共享的目的。OSI7层网络模型传输过程数据从一个主机A发送到主机B时候,......
  • linux网络编程-线程创建和退出
    线程创建函数:intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg);第一个参数thread是出参,传出创建的线程......
  • 让人恶心的多线程代码,性能怎么优化!
    小姐姐味道(微信公众号ID:xjjdog)Java中最烦人的,就是多线程,一不小心,代码写的比单线程还慢,这就让人非常尴尬。通常情况下,我们会使用ThreadLocal实现线程封闭,比如避免SimpleD......
  • linux与shell 9.安装软件(Debian)
    了解aptaptlist列出所有可用安装包apt--installedlist列出已安装安装包[是否已安装,是否自动升级]aptshowpackage_name安装软件详细信息dpkg-lpackage_name......
  • 《安富莱嵌入式周报》第296期:硬件电路实现SPI转以太网,单片机3D游戏图形引擎,Linux基金
    ​​​​ 视频版:​​https://www.bilibili.com/video/BV1Nv4y1X7Tx​​1、硬件电路实现SPI转以太网10BASE-T作者详细介绍:​​​https://imihajlov.tk/blog/posts/eth-to-sp......
  • Linux下Docker安装
    目录一、安装Docker二、配置远程访问通过docker.service配置通过daemon.json文件配置通过SSH证书三、安装Harbor下载安装包解压安装试运行docker配置私有Harbor仓库地址I......
  • 纷繁复杂的操作系统到底是什么关系从APPLE到Android到Linux等
    各个系统之间的关系最近接触了很多很多系统,多种多样,纷繁复杂,感觉有点乱想整理以下思路,结果一下笔内容还挺多,不全,就是现在能见到的,梳理一下,站在一个外行的角度写写省的乱,不......
  • linux安装go环境
    官方网站下载:​​https://golang.google.cn/dl/go1.19.4.linux-amd64.tar.gz​​wget ​​https://golang.google.cn/dl/go1.19.4.linux-amd64.tar.gz​​tar-zxvf ​​g......