学习笔记第二十六天

1.pthread_cancel

函数定义结构:

#include <pthread.h> 
int pthread_cancel(pthread_t thread);

参数:

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

返回值:

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

2.pthread_detach

函数定义结构:

#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初始化互斥锁
int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *attr);
  • mutex:指向互斥锁变量的指针。
  • attr:指向互斥锁属性的指针,如果为NULL,则使用默认属性。
6.2销毁互斥锁
int pthread_mutex_destroy(pthread_mutex_t *mutex);
  • mutex:指向需要销毁的互斥锁变量的指针。
6.3锁定互斥锁
int pthread_mutex_lock(pthread_mutex_t *mutex);
  • mutex:指向需要锁定的互斥锁变量的指针。
6.4解锁互斥锁
int pthread_mutex_unlock(pthread_mutex_t *mutex);
  • mutex:指向需要解锁的互斥锁变量的指针。
6.5尝试锁定互斥锁

	int pthread_mutex_trylock(pthread_mutex_t *mutex);
  • mutex:指向需要尝试锁定的互斥锁变量的指针。
  • 如果互斥锁已被其他线程锁定,pthread_mutex_trylock会立即返回EBUSY错误,而不是阻塞当前线程。
6.6使用注意事项
  1. 死锁:在使用互斥锁时,要特别注意避免死锁的情况,即两个或多个线程互相等待对方释放锁。

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值