学习笔记第二十六天

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),允许同一个线程多次锁定同一个互斥锁。但在使用时需要谨慎,因为不当的使用仍然可能导致死锁或资源耗尽。

相关推荐
腻害兔6 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社7 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
克里斯蒂亚诺更新7 小时前
ruoyi角色权限的对应关系
笔记
萧瑟余晖8 小时前
JDK 26 新特性详解
java·开发语言
马优晨8 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
a11177610 小时前
2FA 验证码生成器(github登录验证 app)
笔记·学习
我的xiaodoujiao10 小时前
API 接口自动化测试详细图文教程学习系列32--Allure测试报告2
python·学习·测试工具·pytest
维天说11 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
破碎的南瓜11 小时前
sqli--sql注入过关笔记(1,2,3,4,5,9)
数据库·笔记·sql
Zane199412 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端