IO进、线程——线程(线程的创建、线程的退出、线程的回收、线程的分离和多线程并发编程)

线程

并发执行的轻量级进程

进程是资源分配的最小单位,线程是任务调度的最小单位

线程是进程的一部分,是任务调度的最小单位。一个进程可以包含多个线程,这些线程可以并发执行,共享进程的资源,但每个线程都有自己的执行路径。在多核处理器上,多个线程可以同时运行,提高了程序的性能和响应能力。下面将对线程的创建、退出、回收和分离

1 创建线程

#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);

功能:创建子线程去执行任务
返回值:成功返回0,失败返回非0
参数说明
thread:线程对象(线程取个名字)
attr:线程属性,使用默认属性写NULL
start_routine:线程要去执行的任务(任务以函数为单位)

void *dosomething(void *arg);

arg:传递给start_routine的参数

pthread_t th;
pthread_t th1;
int ret = pthread_create(&th, NULL, test, "线程1");
int ret1 = pthread_create(&th1, NULL, test, "线程2");
if(ret != 0 || ret1 != 0){perror("pthread_create");return -1;
}

2 线程退出

void pthread_exit(void *retval);

功能:退出当前线程
参数说明
retval:线程退出时想要传递的信息

在线程执行完任务后,可以调用**pthread_exit(NULL)**来正常退出线程。

3 线程回收

int pthread_join(pthread_t thread, void **retval);

功能:阻塞回收退出的子线程
返回值:成功返回0,失败返回-1
参数说明:
thread:要回收的线程
retval:指向线程退出时传递的信息

void *retval;
ret = pthread_join(th, &retval);
ret1 = pthread_join(th1, &retval);
if(ret < 0 || ret1 < 0){perror("pthread_join");return -1;
}

4 线程分离

int pthread_detach(pthread_t thread);

功能:断绝父子线程的关系
返回值:成功返回0,失败返回-1
参数说明:
thread:要断绝关系的子线程对象
注:一般在创建完子线程过后马上调用分离函数

当线程分离后,线程执行完任务后会自动释放资源,不需要再主线程中调用pthread_join()来回收线程。一般在创建完子线程后,如果不需要回收子线程资源,可以立即调用pthread_detach()函数进行分离。

pthread_detach(th);
pthread_detach(th1);

多线程并发

①两个线程同时在打印40个数,各打印个互不干扰。

#include <stdio.h>
#include <pthread.h>
#include <unistd.h>
void *test(void *args){char *name = (char *)args;for(int i = 0; i < 40; i++){printf("线程:%s 正在处理第:%d\n", name, i);}return NULL;
}int main(int argc, char *argv[])
{ pthread_t th;pthread_t th1;int ret = pthread_create(&th, NULL, test, "线程1");int ret1 = pthread_create(&th1, NULL, test, "线程2");if(ret != 0 || ret1 != 0){perror("pthread_create");return -1;}pthread_detach(th);pthread_detach(th1);void *retval;ret = pthread_join(th, &retval);ret1 = pthread_join(th1, &retval);if(ret < 0 || ret1 < 0){perror("pthread_join");return -1;}sleep(2);return 0;
} 

②三个线程共同分担打印50个数

/*===============================================
*   文件名称:并发多线程.c
*   创 建 者:杨桃清
*   创建日期:2023年07月31日 00:22
*   描    述:
================================================*/
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>//声明互斥锁
pthread_mutex_t mutex;
int count = 0;void *print_num(void *args){char *name = (char *)args;while(1){//申请互斥锁pthread_mutex_lock(&mutex);if(count >= 50){//释放互斥锁pthread_mutex_unlock(&mutex);break;}printf("线程:%s  正在打印:%d\n", name, count);count++;//最后释放锁pthread_mutex_unlock(&mutex);}return NULL;
}int main(int argc, char *argv[])
{ pthread_t th1;pthread_t th2;pthread_t th3;//初始化锁pthread_mutex_init(&mutex, NULL);//创3个建线程int ret1 = pthread_create(&th1, NULL, print_num, "th1");int ret2 = pthread_create(&th2, NULL, print_num, "th2");int ret3 = pthread_create(&th3, NULL, print_num, "th3");if(ret1 != 0 || ret2 != 0 || ret3 != 0){perror("pthread_create");return -1;}//void* retval;pthread_join(th1, NULL);//等待第一个线程执行完毕pthread_join(th2, NULL);//等待第二个线程执行完毕pthread_join(th3, NULL);//等待第三个线程执行完毕//销毁互斥锁pthread_mutex_destroy(&mutex);return 0;
} 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/17967.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

QT--day4(定时器事件、鼠标事件、键盘事件、绘制事件、实现画板、QT实现TCP服务器)

QT实现tcpf服务器代码&#xff1a;&#xff08;源文件&#xff09; #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);//给服务器指针实例化空间server new QTc…

excel中使地址按十六进制进行数值递增的函数

这里是尼德兰的喵工具相关文章&#xff0c;欢迎您的访问&#xff01; 如果文章对您有所帮助&#xff0c;期待您的点赞收藏&#xff01; 让我们一起为成为芯片前端全栈工程师而努力&#xff01; 在进行寄存器编写时很多时候会涉及到算地址的问题&#xff0c;通常32bit位宽的寄存…

棕榈酰三肽-38——对额间纹,鱼尾纹,抬头纹和颈纹非常有效

简介 棕榈酰三肽-38由三个氨基酸组成&#xff0c;是一种双氧化的脂肽。这种肽的灵感源自于天然存在于胶原蛋白VI和层粘连蛋白中的一种三肽。 它可以在需要的地方&#xff0c;从内部重建肌肤&#xff0c;使皱纹平滑皮肤得到舒缓&#xff0c;尤其对额间纹&#xff0c;鱼尾纹&…

电教智能云数据可视化平台开发电脑优化日志实录

电教智能云数据可视化平台开发电脑优化日志实录 一、2K和4K弹窗判断二、电能API对接1.电脑爬虫2.电能分组过滤3.数据可视化渲染4.弹窗 三.数组按顺序输出 一、2K和4K弹窗判断 {* 判断2k和4k弹窗 *}{if $dataScene[scene_standard] eq 0}<a class"menuBtn subMenu"…

Spring整合Mybatis、Spring整合JUnit

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaweb 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Spring整合 一、Spring整合Mybatis1.1 整合Mybatis&#x…

python设计模式

16种设计模式 1.简单工厂模式 内容:不直接向客户端暴露对象创建的实现细节,而是通过一个工厂来负责创建产品类的实例 角色: 工厂角色(Creator) 抽象产品角色(Product) 具体产品角色(Concrete Product) 优点: 1.隐藏了对象创建的实现细节 2.客户端不需要修改代码 缺点: 1.违…

记录一次通过iostat命令定位系统数据库CPU飙升的案例

一、背景 我们有个移动考勤的系统&#xff0c;运维监控系统显示&#xff0c;每到上下班时间&#xff0c;考勤数据库的CPU就飙升到100%&#xff0c;磁盘读写请求等待时间变长&#xff0c;最初无法确定是磁盘性能下降导致的CPU飙升&#xff0c;还是CPU飙升导致的磁盘性能下降&…

C# 外观模式

概述 外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它提供了一个统一的接口&#xff0c;用于访问子系统中的一组接口。外观模式隐藏了子系统的复杂性&#xff0c;使得客户端可以通过简单的接口与子系统进行交互。 外观模式定义了一个高层…

设计模式之观察者模式

定义&#xff1a;对象间的一种一对多的依赖关系&#xff0c;当一个对象的状态发货所能改变时&#xff0c;所有依赖它的对象都得到通知并被自动更新。 例子&#xff1a;报纸-邮局-用户 不用设计模式实现 被观察者 package com.tao.YanMoDesignPattern.observer.case3_Origin;…

计算语言模型计算每秒钟生成的token数量it/s

在 main() 函数的stream循环中&#xff0c;我们可以计算每秒钟生成的token数量&#xff0c;然后输出 it/s。在流式生成过程中&#xff0c;我们可以使用Python的time模块来计算速度。在测试时&#xff0c;生成速度会受到多个因素的影响&#xff0c;包括设备性能、模型大小、输入…

Docker快速入门笔记

Docker快速入门 前言 当今软件开发领域的一股热潮正在迅速兴起&#xff0c;它融合了便捷性、灵活性和可移植性&#xff0c;让开发者们欣喜若狂。它就是 Docker&#xff01;无论你是一个初学者&#xff0c;还是一位经验丰富的开发者&#xff0c;都不能错过这个引领技术浪潮的工…

基本不等式@平均值不等式@双勾函数不等式

文章目录 基本不等式基本齐次不等式一次形式&#x1f47a;基本不等式拓展拓展1拓展2 算数平均数和几何平均数不等式应用恒等变形 双勾函数不等式导数函数单调性&#x1f388;求解过程 极值点和极值函数单调性的简单证明&#x1f388; 基本不等式 基本齐次不等式 设 a , b ∈ …

windwos server 2008 更新环境,且vs_redis 安装失败

KB2919442 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 KB2919355 下载地址:https://www.microsoft.com/zh-cn/download/confirmation.aspx?id42153 安装步骤:先安装442,后安装355

C语言打印水仙花数

“水仙花数”是指一个n位数&#xff0c;其各位数字的n次方之和确好等于该数本身&#xff0c;如:153&#xff1d;13&#xff0b;53&#xff0b;3^3&#xff0c;则153是一个“水仙花数”。 思路&#xff0c;先把每个数的每位算出来&#xff0c;然后再判断他们的3次方相加是否这个…

Ansible中常用的模块结合案例使用详解

Ansible中常用的模块结合案例使用详解 1. file模块2. copy模块3. yum_repository模块4. yum模块5. service模块6. systemd模块7. cron模块8. user模块9. group模块10. fetch模块11. get_url模块12. unarchive模块13. synchronize模块14. block模块15. parted模块16. firewalld模…

Linux ps命令:查看正在运行的进程

ps 命令是最常用的监控进程的命令&#xff0c;通过此命令可以查看系统中所有运行进程的详细信息。 ps 命令的基本格式如下&#xff1a; [rootlocalhost ~]# ps aux #查看系统中所有的进程&#xff0c;使用 BS 操作系统格式 [rootlocalhost ~]# ps -le #查看系统中所有的进程&am…

Vue中常用到的标签和指令

一、标签 在 Vue 中&#xff0c;并没有特定的标签是属于 Vue 的&#xff0c;因为 Vue 是一个用于构建用户界面的框架&#xff0c;可以与 HTML 标签一起使用。Vue 中可以使用的标签和元素基本上与 HTML 标准一致。 以下是一些常见的HTML标签&#xff0c;也可以在 Vue 中使用&a…

HTML+CSS+JavaScript:随机抽奖案例

一、需求 在时代少年团的七个人中&#xff0c;随机抽取一个人获得一等奖&#xff0c;再抽取一个获二等奖&#xff0c;再抽取一个获三等奖。注意同一个人不能同时获得多个奖项 如下图所示 二、代码素材 以下是缺失JS部分的代码&#xff0c;感兴趣的小伙伴可以先自己试着写一写…

oracle数据库dbLink的使用

Oracle的数据库链路&#xff08;dbLink&#xff09;是一种允许在两个不同的数据库实例之间进行通信和数据交换的功能。它可以让你在一个数据库中访问另一个数据库的对象和数据&#xff0c;就像它们属于同一个数据库一样。 创建一个link: CREATE public DATABASE LINK link_sco…

计算机网络用户接入层设计

用户接入层为用户提供访问核心网络的能力&#xff0c; 为用户提供共享/交换的带宽分配&#xff0c;按照业主要求,并考虑到端口密度的要求以及 设备的性能价格比,建议选用 Catalyst 3524XL和 Catalyst 3548XL 工作组交换 机&#xff0c;分别放置于配线间中。如同一配线间需两台以…