首页 > 系统相关 >linux网络编程-线程创建和退出

linux网络编程-线程创建和退出

时间:2022-12-25 11:12:18浏览次数:35  
标签:linux count void 编程 mutex pthread 线程 数量

线程创建函数:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 第一个参数thread是出参,传出创建的线程id;第二个参数attr是线程属性,可以不设置,传入NULL即可;第三个参数start_routine是用户定义的函数,也就是线程要执行的函数;arg是传给start_routine的参数,不需要参数时传入NULL即可;线程创建函数执行成功时返回0,返回其他值则存在错误。

线程终止:线程有多种情况会发生终止,1) 线程内调用pthread_exit,2) start_routine自己返回,3) 线程被cancel(pthread_cancel),4) 进程通过exit终止。

线程退出函数:int pthread_cancel(pthread_t thread); 该函数根据参数(线程id),给指定线程发送退出信号。

举个例子:消费者线程给生产者线程发送退出信号。

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

编译:

gcc pthread_cancel.c -lpthread -o pthread

运行结果:

$ ./pthread
消费前,总数量:0
消费后,总数量:-1, count = 1
生产前,总数量:0
生产后,总数量:0
消费前,总数量:0
消费后,总数量:-1, count = 2
生产前,总数量:0
生产后,总数量:0
消费前,总数量:0
消费后,总数量:-1, count = 3
生产前,总数量:-1
生产后,总数量:0
消费前,总数量:0
消费后,总数量:-1, count = 4
生产前,总数量:0
生产后,总数量:0
消费前,总数量:0
消费后,总数量:-1, count = 5
生产前,总数量:-1
生产后,总数量:0
消费前,总数量:0
消费后,总数量:-1, count = 6
生产前,总数量:0
生产后,总数量:0
consumer退出
生产前,总数量:0
生产后,总数量:1
生产前,总数量:1
生产后,总数量:2
生产前,总数量:2
生产后,总数量:3
生产前,总数量:3
生产后,总数量:4
生产前,总数量:4
生产后,总数量:5
生产前,总数量:5

 

标签:linux,count,void,编程,mutex,pthread,线程,数量
From: https://www.cnblogs.com/zzx2bky/p/17003774.html

相关文章

  • 让人恶心的多线程代码,性能怎么优化!
    小姐姐味道(微信公众号ID:xjjdog)Java中最烦人的,就是多线程,一不小心,代码写的比单线程还慢,这就让人非常尴尬。通常情况下,我们会使用ThreadLocal实现线程封闭,比如避免SimpleD......
  • linux与shell 9.安装软件(Debian)
    了解aptaptlist列出所有可用安装包apt--installedlist列出已安装安装包[是否已安装,是否自动升级]aptshowpackage_name安装软件详细信息dpkg-lpackage_name......
  • Java串口编程
     很久以前写的一个java串口通讯程序,用的是comm.jar。用java搞串口通讯就是用菜刀削水果-虽然也能做到,但是很麻烦。贴下核心类:packagecom.jzdf.odu.serial;importjava.i......
  • 《安富莱嵌入式周报》第296期:硬件电路实现SPI转以太网,单片机3D游戏图形引擎,Linux基金
    ​​​​ 视频版:​​https://www.bilibili.com/video/BV1Nv4y1X7Tx​​1、硬件电路实现SPI转以太网10BASE-T作者详细介绍:​​​https://imihajlov.tk/blog/posts/eth-to-sp......
  • 仿文:普通人或者门外汉该怎样入门编程?
    继我关注很久一位编程的大牛发布了他的那篇文章——<探究:普通人都是怎么入门编程>​​我先去再相关评论里看到了有人说这是AI写的一样,不过我对这篇文章的作者稍微有些了......
  • Java编程思想8
    第十三章:字符串​由于字符串在我们开发中使用频率是相当高的,本章内容也主要介绍了一些关于字符串常用的API,需要注意的是String对象是不可变的,String类中每一个看起来会修......
  • Linux下Docker安装
    目录一、安装Docker二、配置远程访问通过docker.service配置通过daemon.json文件配置通过SSH证书三、安装Harbor下载安装包解压安装试运行docker配置私有Harbor仓库地址I......
  • 纷繁复杂的操作系统到底是什么关系从APPLE到Android到Linux等
    各个系统之间的关系最近接触了很多很多系统,多种多样,纷繁复杂,感觉有点乱想整理以下思路,结果一下笔内容还挺多,不全,就是现在能见到的,梳理一下,站在一个外行的角度写写省的乱,不......
  • Java编程思想6
    第十一章:持有对象如果一个程序只包含固定数量的且其生命周期都是已知的对象,那么这是一个非常简单的程序。​通常,程序总是根据运行时才知道的某些条件去创建新对象,在此之......
  • Java编程思想7
    第十二章:通过异常处理错误Java的基本理念是“结构不佳的代码不能运行”。​发现错误的理想时机是在编译阶段,也就是在你试图运行程序之前。然而,编译期间并不能找出所有的......