Linux系统编程 day10 接着线程(中期头大,还要写论文)

线程有点懵逼

线程之前函数回顾以及总结部分(对不清楚的问题再思考)

线程控制原语                进程控制原语
pthread_create();          fork();
pthread_self();            getpid();
pthread_exit();            exit();
pthread_join();            wait()/waitpid();
pthread_cancel();          kill();
pthread_detach();

这里写一下昨天的join函数,那块有点难理解。

#include<stdlib.h>
#include<string.h>
#include<stdio.h>
#include<pthread.h>
#include<unistd.h>struct thrd{int var ; char str[256];
};void* func(void * arg)
{struct thrd *th; // 这里不能直接使用结构体,因为这是在栈上的th = malloc(sizeof(struct thrd)); // 这边需要在堆区分配内存,如果不使用堆区会发生错误,因为当线程执行完之后,栈上的内存会释放,如果返回栈上的内容会非法访问。th->val = 200;strcpy(th->str , "hello pthread_join");return (void*)th;
}int main(int argc , char* argv[])
{pthread_t tid ; struct thrd *retval;int ret = pthread_create(&tid , NULL , func , NULL);if(ret != 0){fprintf(stderr , "pthread_create error : %s\n" , strerror(ret)); exit(1);   }ret = pthread_join(tid , (void**)&retval);if(ret != 0){fprintf(stderr , "pthread_join error : %s\n" , strerror(ret)); exit(1);   }printf("child thread exit with var = %d , str = %s\n " , retval->val , retval->str);pthread_exit(NULL);}

线程当中用perror没有用,线程会直接返回errno,所以在线程中错误一般使用下面这个格式:

if(ret != 0){fprintf(stderr , "pthread_create error : %s\n" , strerror(ret)); exit(1);   
}

线程分离之后,子线程结束会自动回收,自动清理PCB,无需回收

ret = pthread_detach(tid)

线程属性

初始化线程属性

int pthread_attr_init(pthread_attr_t* attr);
成功返回0
失败errnofprintf(stderr , "pthread_xxx error:%s\n" , strerror(ret));

销毁线程属性所占用的资源 

int pthread_attr_destroy(pthread_attr_t* attr);
成功返回0
失败errno
fprintf(strerr , "pthread_attr_destroy error:%s\n" , strerror(ret));

设置线程分离

int pthread_attr_setdetachstate(pthread_attr_t* attr , int detachstate);参数:attr:已初始化的线程属性
detachstate : PTHREAD_CREATE_DETACHED(分离线程)PTHRED_CREATE_JOINABLE(非分离线程)
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<unistd.h>
#include<pthread.h>void* tfn(void* arg){printf("thread:pid = %d , tid = %lu\n" , getpid() , pthread_self());return NULL;
}int main(int argc , char *argv[])
{pthread_t tid ;//tid = pthread_self();pthread_attr_t attr;int ret = pthread_attr_init(&attr);if(ret != 0){fprintf(stderr , "pthread_attr_init error:%s/n" , strerror(ret));exit(1);}ret = pthread_attr_setdetachstate(&attr , PTHREAD_CREATE_DETACHED);//设置线>程属性为分离属性if(ret != 0){fprintf(stderr , "pthread_attr_setdetachstate error:%s/n" , strerror(ret));exit(1);}ret = pthread_create(&tid , &attr , tfn , NULL);if(ret != 0){fprintf(stderr , "pthread_create error:%s/n" , strerror(ret));exit(1);}ret = pthread_attr_destroy(&attr);if(ret != 0){fprintf(stderr , "pthread_attr_destory error:%s/n" , strerror(ret));exit(1);}ret = pthread_join(tid , NULL); // 如何查看是否是分离状态,不使用那个函数,>函数太长了,可以使用join函数,如果join函数回收失败出现错误,就表示已经为线程分离
。if(ret != 0){fprintf(stderr , "pthread_join error:%s/n" , strerror(ret));exit(1);}printf("main:pid = %d , tid = %lu\n" , getpid() , pthread_self());pthread_exit(NULL);
}

线程使用注意事项

1、主线程退出其他线程不退出,主线程要使用pthread_exit()。

2、避免僵尸线程。

3、malloc和mmap申请的内存可以被其他线程释放。

4、避免在多线程模型中使用fork,子进程中只有调用fork的线程存在,其余均被退出。

5、信号的复杂语义很难和多线程共存,应避免在多线程引入信号机制。

线程同步

同步:协同,讲究先后次序。

协同步调,对公共区域数据按序访问,防止数据混乱,产生与时间有关的错误。

锁的使用

建议锁,对公共数据进行保护,所有进程应该在访问公共数据之前先拿锁再访问,但锁本身不具备强制性。

互斥锁/互斥量mutex

 使用mutex(互斥量、互斥锁)一般步骤

1、pthread_mutex_t lock;    创建锁
2、pthread_mutex_init();    初始化锁
3、pthread_mutex_lock();    加锁
4、访问共享数据
5、pthread_mutex_unlock();  解锁
6、pthread_mutex_destory(); 销毁锁上述函数成功返回0,失败返回errno

 注意事项:尽量保证锁的粒度

restrict关键字:
用来限定指针变量,被该关键字限定的指针变量所指向的内存操作,必须由本指针完成int pthread_mutex_init(pthread_mutex_t *restrict mutex , const pthread_mutexattr_t *restrict attr);

今天没学完,还要写论文

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

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

相关文章

《浔川AI翻译v6.1.0问题已修复公告》

《浔川AI翻译v6.1.0问题已修复公告》 尊敬的浔川AI翻译用户&#xff1a; 感谢您对浔川AI翻译的支持与反馈&#xff01;我们已针对 **v6.1.0** 版本中用户反馈的多个问题进行了全面修复&#xff0c;并优化了系统稳定性。以下是本次修复的主要内容&#xff1a; 已修复问题 ✅…

深入理解 java synchronized 关键字

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…

华三(H3C)与华为(Huawei)设备配置IPsec VPN的详细说明,涵盖配置流程、参数设置及常见问题处理

以下是针对华三&#xff08;H3C&#xff09;与华为&#xff08;Huawei&#xff09;设备配置IPsec VPN的详细说明&#xff0c;涵盖配置流程、参数设置及常见问题处理&#xff1a; 一、华三&#xff08;H3C&#xff09;设备IPsec VPN配置详解 1. 配置流程 华三IPsec VPN配置主要…

KBEngine 源代码分析(一):pyscript 目录文件介绍

pyscript 目录文件 pyscript 目录提供了 KBEngine 把 C++ 代码中的类注册到 Python 的机制 同时也提供了 C++ 调用 Python 方法的例子 相对现在的 C++ 17/20 ,这个目录的分装相对不优雅 不过不影响学习如何使用 Python 官方库提供的 API ,实现 C++ Python 混合编程 C++ …

线程入门3

synchronized修饰方法 synchronized可以修饰代码块(在线程入门2中有例子)&#xff0c;也可以修饰普通方法和静态方法。 修饰普通方法 修饰普通方法简化写法&#xff1a; 修饰静态方法 修饰静态方法简化写法&#xff1a; 注意&#xff1a;利用synchronized上锁&#xff0c;锁的…

linux上Flexlm命令

FlexLM 是一种灵活的许可证管理系统&#xff0c;广泛用于各种软件产品中&#xff0c;如 Autodesk 的 AutoCAD 和 Autodesk 的其他产品。它允许软件开发商控制软件的使用和分发&#xff0c;同时提供灵活的许可证管理策略。在 Linux 系统中使用 FlexLM 通常涉及到几个关键步骤&am…

【Java学习方法】终止循环的关键字

终止循环的关键字 一、break 作用&#xff1a;跳出最近的循环&#xff08;直接结束离break最近的那层循环&#xff09; 使用场景&#xff1a;一般搭配if条件判断&#xff0c;如果满足某个条件&#xff0c;就结束循环&#xff0c;&#xff08;场景&#xff1a;常见于暴力枚举中…

【论文精读】Reformer:高效Transformer如何突破长序列处理瓶颈?

目录 一、引言&#xff1a;当Transformer遇到长序列瓶颈二、核心技术解析&#xff1a;从暴力计算到智能优化1. 局部敏感哈希注意力&#xff08;LSH Attention&#xff09;&#xff1a;用“聚类筛选”替代“全量计算”关键步骤&#xff1a;数学优化&#xff1a; 2. 可逆残差网络…

关于在Springboot中设置时间格式问题

目录 1-设置全局时间格式1.Date类型的时间2.JDK8时间3.使Date类和JDK8时间类统统格式化时间 2-关于DateTimeFormat注解 1-设置全局时间格式 1.Date类型的时间 对于老项目来说&#xff0c;springboot中许多类使用的是Date类型的时间&#xff0c;没有用到LocalDateTime等JDK8时…

面试篇:Java并发与多线程

基础概念 什么是线程&#xff1f;线程和进程的区别是什么&#xff1f; 线程 是程序执行的最小单位&#xff0c;它是 CPU 调度和执行的基本单元。一个进程可以包含多个线程&#xff0c;这些线程共享进程的资源&#xff08;如内存&#xff09;&#xff0c;但每个线程有自己的栈…

【Qt/C++】QPrinter关于QInternal::Printer的解析

1. 问题分析 QInternal::Printer在Qt框架中并不是一个直接暴露给用户的API。相反&#xff0c;它是一个枚举值&#xff0c;用于标识QPaintDevice的类型。在Qt中&#xff0c;QPaintDevice是一个抽象类&#xff0c;用于任何可以进行绘制的设备&#xff0c;如窗口、图像、打印机等…

uniapp返回上一页接口数据更新了,页面未更新

注意&#xff1a;不是组件套组件可以不使用setTimeout延时 返回上一页一般会走onshow&#xff0c;但是接口更新了页面未更新 onShow(() > {// 切换城市后重新调用数据if (areaId.value) {const timer setTimeout(async () > {timer && clearTimeout(timer);…

MCU开发学习记录11 - ADC学习与实践(HAL库) - 单通道ADC采集、多通道ADC采集、定时器触发连续ADC采集 - STM32CubeMX

名词解释&#xff1a; ADC&#xff1a; Analog-to-Digital SAR&#xff1a;Successive Approximation Register 本文将介绍ADC的概念、相关函数以及STM32CubeMX生成ADC的配置函数。针对于ADC实践&#xff1a;单通道采集芯片内部温度传感器&#xff08;ADC1_ch16&#xff09;&a…

68元撬动未来:明远智睿2351开发板重塑嵌入式开发生态

在嵌入式开发领域&#xff0c;价格与性能的矛盾始终存在&#xff1a;高端开发板功能强大但成本高昂&#xff0c;低价产品则往往受限于性能与扩展性。明远智睿2351开发板以68元&#xff08;含税&#xff09;的定价打破这一僵局&#xff0c;通过四核1.4G处理器、全功能Linux系统与…

关于ubuntu密码正确但是无法登录的情况

参考这个文章&#xff1a; https://blog.csdn.net/cuichongxin/article/details/117462494 检查一下是不是用户被lock了 输入passwd -s username 如果用户是L状态&#xff0c;那么就是lock了。 使用 passwd -u username 解锁 关于 .bashrc 不生效 有几点&#xff1a; ~/.…

LeetCode-47. 全排列 II

1、题目描述&#xff1a; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&am…

Python 设计模式:访问者模式

1. 什么是访问者模式&#xff1f; 访问者模式是一种行为设计模式&#xff0c;它允许你在不改变对象结构的前提下&#xff0c;定义新的操作。通过将操作封装在访问者对象中&#xff0c;访问者模式使得你可以在不修改元素类的情况下&#xff0c;向元素类添加新的功能。 访问者模…

基于stm32的智能门锁系统

标题:基于stm32的智能门锁系统 内容:1.摘要 摘要&#xff1a;随着科技的飞速发展&#xff0c;人们对家居安全的要求日益提高&#xff0c;智能门锁系统应运而生。本研究的目的是设计并实现一个基于STM32的智能门锁系统。采用STM32微控制器作为核心控制单元&#xff0c;结合指纹…

GitHub 常见高频问题与解决方案(实用手册)

目录 1.Push 提示权限错误(Permission denied) 2.push 报错:rejected non-fast-forward 3.忘记添加 .gitignore,上传了无关文件 4. 撤销最近一次 commit 5.clone 太慢或失败 6.如何切换/创建分支 7.如何合并分支 8.如何删除远程分支 9.如何 Fork + PR(Pull Reque…

【MySQL数据库入门到精通-04 DML操作】

一、DML DML英文全称是Data Manipulation Language(数据操作语言)&#xff0c;用来对数据库中表的数据记录进行增、删、改操作。 二、添加数据 1.给指定字段添加数据 代码如下&#xff08;示例&#xff09;&#xff1a; insert into 表名 &#xff08;字段1&#xff0c;字…