当前位置: 首页 > 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;
}

相关文章:

  • 【系统分析师】2009年真题:综合知识-答案及详解
  • JavaEE初阶第一期:计算机是如何 “思考” 的(上)
  • 如何统一从一个共享的配置文件(比如 config.yaml 和 config.py)加载配置信息,避免硬编码。
  • 14:00开始面试,14:06就出来了,问的问题有点变态。。。
  • leetcode0765. 情侣牵手-hard
  • 【多线程初阶】详解线程池(上)
  • 什么是旋转开关?
  • 芯片测试之 trim修调测试详解
  • 掌握C#枚举:从交通灯看懂状态管理
  • 【0.3 漫画数据结构与算法】
  • Sngine 4.0.4海外社交平台PHP源码 – 多语言支持短视频和博客订阅(源码下载)
  • pdb/sdf转pdbqt错误、pdbqt小分子文件对接蛋白质dock分数为0
  • [Linux入门] Linux磁盘管理与文件系统
  • Heterogeneous Graph Transformer (WWW 2020)译文
  • Spring学习笔记
  • Java并发编程实战 Day 22:高性能无锁编程技术
  • RT-Thread Studio SDK管理器安装资源包失败
  • uniapp打包安卓和ios
  • 初学STM32编程技巧全功能按键非阻塞式实现
  • Amazon Q in QuickSight 实战:自然语言秒级生成数据报表与深度洞察
  • 3d效果图制作软件/兰州网络推广优化服务
  • 动态网站建设实训实训心得/网站优化排名软件
  • 局网站建设工作征求意见/网站流量查询工具
  • 公司网站建设公司/公司建官网要多少钱
  • 网站建设什么软件好/关键词大全
  • 网站怎么做分享链接地址/搜索引擎排名优化价格