当前位置: 首页 > news >正文

Linux【8】-----Linux系统编程(并发编程原理与应用)

1 线程

1.1 线程创建

可以使用

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

在这里插入图片描述

  • thread 是指向线程标识符的指针,线程创建成功,用来返回线程ID
  • attr 指定线程属性
  • start_routine 函数指针,就是线程创建后要调用的函数
  • arg 传递给线程函数的参数

线程使用的是进程的资源,进程结束后其他线程也会一起退出

1.2 线程退出

使用
pthread_exit()
该接口可以实现线程终止
或线程执行的函数内部执行return

主线程调用pthread_exit()不会导致子线程结束
但是如果调用exit()或return,就会导致所以线程结束

1.3 线程接合

pthread_join 用来释放僵尸线程资源,
退出状态会被保存到retval中

       #include <pthread.h>int pthread_join(pthread_t thread, void **retval);

1.4 线程属性

在这里插入图片描述
线程的属性是在线程创建过程中进行设置的

       #include <pthread.h>int pthread_attr_init(pthread_attr_t *attr);int pthread_attr_destroy(pthread_attr_t *attr);

让线程分离,在线程终止后,就会自动释放资源

练习:设计一个程序,要求在程序中创建两条子线程,主线程创建一个线程的属性对象,并对线程的属性对象进行初始化之后,要求创建的子线程的属性设置为分离属性,子线程A输出”hello”,子线程B输出”world”,主线程创建子线程之后就终止。

void *task_1(void *arg){printf("Hello ");
}void *task_2(void *arg){printf("world ");
}int main(){pthread_attr_t thread_attr;pthread_attr_init(&thread_attr);pthread_attr_setdetachstate(&thread_attr, PTHREAD_CREATE_JOINABLE);pthread_t thread_1;pthread_create(&thread_1, &thread_attr, task_1, NULL);pthread_t thread_2;pthread_create(&thread_2, &thread_attr, task_2, NULL);sleep(1);return 0;
}

如果在创建线程之初不设置属性,可以使用pthread_detach()函数来强制设置自身属性为分离属性。

2 多线程的同步与互斥

2.1 互斥锁

  • 互斥锁需要经过初始化:
#incldue <pthread.h>
int pthread_mutex_init(pthread_mutex_t *restrict mutex,const pthread_mutexattr_t *restrict attr);

互斥量本质上就是一个变量,类型为pthread_mutex_t

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
  • 上锁解锁操作
pthread_mutex_lock(pthread_mutex_t* mutex);
pthread_mutex_trylock(pthread_mutex_t* mutex);
pthread_mutex_unlock(pthread_mutex_t* mutex);

练习:创建一个进程,在主线程中创建一个子线程,主线程和子线程都会使用相同的临界资源(全局变量),要求线程之前使用互斥锁实现资源的互斥访问。

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int data;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void *task_1(void *arg){for(int i = 0; i < 20000; i++){//pthread_mutex_lock(&mutex);data = data+1;//pthread_mutex_unlock(&mutex);}
}void *task_2(void *arg){for(int i = 0; i < 20000; i++){pthread_mutex_lock(&mutex);data = data+1;pthread_mutex_unlock(&mutex);}
}int main(){pthread_mutex_init(&mutex, NULL);pthread_t thread_1;pthread_create(&thread_1, NULL, task_1, NULL);pthread_t thread_2;pthread_create(&thread_2, NULL, task_1, NULL);pthread_join(thread_1, NULL);pthread_join(thread_2, NULL);printf("data = %d\n", data);return 0;
}
http://www.xdnf.cn/news/1041985.html

相关文章:

  • YOLO系列对指定图片绘制模型热力图
  • Day.31
  • 从0到1开发一个自己的工具 MCP 并发布到 test PyPi(Python个人版)
  • 代码审计服务:如何解决误报与漏报难题,保障软件安全?
  • 从MVC到MVVM:从过程式走向声明式
  • 14:00开始面试,14:06就出来了,问的问题有点变态。。。
  • 谷歌“Find Hub”,携UWB、卫星连接、行李追踪三大功能强势挑战苹果“查找”
  • 渲染学进阶内容——机械动力的渲染系统(2)
  • 【DSP笔记 · 第4章】算法的奇迹:快速傅里叶变换(FFT)如何改变世界
  • LangGraph基础知识(Store )(四)
  • 3.1.3_栈的链式存储实现
  • MCP前后端技术研究和应用实践
  • 细聊工业级网络变压器在不同行业中的浪涌等级选型应用
  • QEMU源码全解析 —— 块设备虚拟化(30)
  • 广东省省考备考(第二十八天6.13)—资料分析(第二节课)
  • 【无标题】定制园区专属地图:如何让底图只显示道路和地面?
  • Relook:softmax函数
  • 状态机(State Machine)详解
  • 车载功能框架 --- 整车安全策略
  • 第六届经济管理与大数据应用国际学术会议 (ICEMBDA 2025)
  • 数据库学习(六)——MySQL事务
  • QT打包应用
  • 天邑TEWA-808AE高安版_S905L3B融合机破解TTL刷机包
  • python做题日记(17)
  • 15.vue.js的watch()和watchEffect()(2)
  • JAVA理论第十八章-JWT杂七杂八
  • Visualized_BGE 安装—多模态嵌入技术
  • Java 复习题选择题(1)(Java概述)
  • LLMs 系列实操科普(5)
  • 【卫星通信】Skylo与ViaSat标准建议详解:基于NB-IoT NTN通过GEO卫星实现IMS语音通话的解决方案