学习笔记第二十六天

1.pthread_cancel

函数定义结构:

cs 复制代码
#include <pthread.h> 
int pthread_cancel(pthread_t thread);

参数:

  • thread:类型为pthread_t,表示要取消的线程的标识符。

返回值:

  • 成功时返回0
  • 失败时返回错误码,可能的错误码包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。

2.pthread_detach

函数定义结构:

cs 复制代码
#include <pthread.h> 
int pthread_detach(pthread_t thread);

参数:

  • thread:类型为pthread_t,表示要设置为分离状态的线程的标识符。

返回值:

  • 成功时返回0
  • 失败时返回错误码,可能的错误码同样包括但不限于EINVAL(表示传入的线程ID无效)和ESRCH(表示没有找到指定的线程)。

3.线程的优缺点

优点:

  1. 资源利用效率高:线程作为进程内的一个实体,能够共享进程的大部分资源(如内存、文件描述符等),显著减少了资源复制和管理的开销。
  2. 上下文切换开销小:由于线程间共享地址空间,它们之间的上下文切换主要涉及寄存器、程序计数器等少量数据,相较于进程间的切换更为高效。
  3. 通信效率高:共享内存使得线程间通信非常快速,避免了进程间通信时需要的复杂IPC(进程间通信)机制。
  4. 多核利用:在多核处理器上,多线程可以实现真正的并行执行,从而提升计算密集型任务的性能。

缺点:

  1. 线程安全问题:由于共享资源,多个线程访问同一资源时容易出现同步问题,需要设计复杂的同步机制来保证数据的一致性和安全性。
  2. 健壮性降低:一个线程的错误可能导致整个进程崩溃,从而影响到进程内的其他线程。
  3. 编程难度大:多线程编程要求开发者对并发控制和同步机制有深入的理解,增加了编程的复杂性和难度。

4.进程的优缺点

优点:

  1. 稳定性和安全性:进程之间相互隔离,一个进程的崩溃不会影响到其他进程,从而提高了系统的稳定性和安全性。
  2. 资源隔离:每个进程拥有独立的地址空间和资源,避免了资源冲突的可能性,有利于系统资源的有效管理。
  3. 多核支持:虽然进程间的通信相对复杂,但多进程仍可以在多核处理器上并行运行,利用多核的计算能力。

缺点:

  1. 资源消耗大:进程的创建、销毁和切换都涉及大量的系统资源,包括内存、CPU时间等,相比线程来说开销较大。
  2. 通信复杂:进程间通信需要通过IPC机制,如管道、消息队列、共享内存等,这些机制通常比线程间通信更为复杂且效率较低。
  3. 进程数受限:由于系统资源的限制,系统中可以创建的进程数量有限,可能无法充分发挥多核处理器的并行处理能力。然而,这种限制在现代操作系统中通常不是问题,因为现代系统允许大量的线程运行(在有限的进程内)。

5.互斥锁的工作原理

互斥锁的工作原理基于互斥(mutual exclusion)的原则,确保在任何给定时间,只有一个线程可以访问特定的代码段或资源,这段被保护的代码或资源通常被称为临界区。

  1. 加锁(Locking):当一个线程需要访问临界区时,它首先会尝试获取互斥锁。如果锁已被其他线程持有,那么当前线程将会被阻塞(即挂起),直到锁被释放。

  2. 访问临界区:一旦线程成功获取了互斥锁,它就可以安全地进入临界区,执行对共享资源的操作。

  3. 解锁(Unlocking):当线程完成对共享资源的操作后,它必须释放互斥锁,以便其他等待的线程可以进入临界区。

6.互斥锁相关函数

6.1初始化互斥锁
cs 复制代码
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • mutex:指向互斥锁变量的指针。
  • attr:指向互斥锁属性的指针,如果为NULL,则使用默认属性。
6.2销毁互斥锁
cs 复制代码
int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • mutex:指向需要销毁的互斥锁变量的指针。
6.3锁定互斥锁
cs 复制代码
int pthread_mutex_lock(pthread_mutex_t *mutex);
  • mutex:指向需要锁定的互斥锁变量的指针。
6.4解锁互斥锁
cs 复制代码
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • mutex:指向需要解锁的互斥锁变量的指针。
6.5尝试锁定互斥锁
cs 复制代码
	int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • mutex:指向需要尝试锁定的互斥锁变量的指针。
  • 如果互斥锁已被其他线程锁定,pthread_mutex_trylock会立即返回EBUSY错误,而不是阻塞当前线程。
6.6使用注意事项
  1. 死锁:在使用互斥锁时,要特别注意避免死锁的情况,即两个或多个线程互相等待对方释放锁。

  2. 锁的顺序:在多个锁的场景下,需要保证所有线程都以相同的顺序获取锁,以避免死锁。

  3. 性能影响:虽然互斥锁能有效保护共享资源,但它们也可能成为性能瓶颈。过度使用锁或在锁的临界区内执行过多操作都会降低程序的性能。

  4. 递归锁:POSIX线程库还支持递归锁(recursive mutex),允许同一个线程多次锁定同一个互斥锁。但在使用时需要谨慎,因为不当的使用仍然可能导致死锁或资源耗尽。

相关推荐
他们叫我阿冠12 分钟前
Day5学习--SpringBoot详解
spring boot·后端·学习
笨拙的老猴子14 分钟前
[特殊字符] Java GC机制详解:G1、ZGC、Shenandoah全面解析与版本演进对比
java·开发语言
tedcloud12319 分钟前
hello-agents部署教程:从零学习AI Agent开发
服务器·人工智能·学习·自动化·powerpoint
我想我不够好。30 分钟前
针对性抓人 随机应变
学习
OSwich42 分钟前
【 Godot 4 学习笔记】命名规范
笔记·学习·godot
砍材农夫1 小时前
物联网 基于netty构建mqtt协议规范(遗嘱与保留消息)
java·开发语言·物联网·netty
DFT计算杂谈1 小时前
KPROJ编译教程
java·前端·python·算法·conda
觅_1 小时前
前端学习后端的时候 选择一个技术
前端·学习
重生之我是Java开发战士1 小时前
【笔试强训】Week5:空调遥控, kotor和气球,走迷宫,主持人调度II,体操队形,二叉树的最大路径和,排序子序列,消减整数
java·算法·动态规划
吃吃今天努力学习了吗1 小时前
【大模型入门学习笔记】常见概念总结
笔记·学习