线程的退出、资源回收,互斥锁

创建多个进程,用循环的方式:

一、线程结束方式

1、pthread_exit(void *)

2、pthread_return

3、pthread_cancle:异常退出,无法获得退出状态,只能回收资源。

程序实例:

二、线程资源回收

1、pthread_join

2、pthread_detach

        线程分离状态:指定该状态,线程主动与主控线程断开关系。使用pthread_exit或者线程自动结束后,其退出状态不由其他线程获取,而直接自己自动释放。网络、多线程服务器常用。

        进程若有该机制,将不会产生僵尸进程。僵尸进程的产生主要由于进程死后,大部分资源被释放,一点残留资源仍存于系统中,导致内核认为该进程仍存在。

函数描述:实现线程分离
函数原型:int pthread_detach(pthread_t thread);
函数返回值:成功:0;失败:错误号
         如果已经对一个线程调用了pthread_detach就不能再调用pthread_join了。其终止状态一直保留到其它线程调用pthread_join获取它的状态为止。但是线程也可以被置为detach状态,这样的线程一旦终止就立刻回收它占用的所有资源,而不保留终止状态。不能对一个已经处于detach状态的线程调用pthread_join。

三、线程和进程

四、互斥锁

机制:锁是一种线程间 同步机制 

原因:线程间的资源竞争:
           共享资源:    临界资源
           临界区  :    访问共享资源(临界资源)那段代码 

用于确保在任意时刻只有一个线程能够访问共享资源,从而避免数据竞争和不确定性的结果。互斥锁提供了一种方式,使得一段关键代码(临界区)在同一时刻只能被一个线程执行。

 1.初始化互斥锁
        (1)静态方式

#include <pthread.h>

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

          (2)动态方式

pthread_mutex_t mutex;
pthread_mutex_init(&mutex, NULL);

         2.加锁
pthread_mutex_lock(&mutex); 

        如果互斥锁已被其他线程锁定,调用线程将被阻塞,直到互斥锁被解锁。 

        3.解锁
pthread_mutex_unlock(&mutex); 

        解锁后,其他线程就可以获取该互斥锁。 

        4.销毁锁
pthread_mutex_destroy(&mutex); 

man pthread_mutex_init

五、死锁

1、死锁产生的4个必要条件
        (1)互斥:某种资源一次只允许一个进程访问,即该资源一旦分配给某个进程,其他进程就不能再访问,直到该进程访问结束;

         (2)占有且等待:一个进程本身占有资源,同时还有资源未得到满足,正在等待其他进程释放该资源。(上述例子讲的)

         (3)不可抢占:别人已经占有了某项资源,不能因为你要用这个资源就把他抢过来;

         (4)循环等待:存在一个进程链,使得每个进程都占有下一个进程所需要的至少一种资源

        发生死锁进程无法进行下去,他们所持有的资源也无法释放。这样会导致CPU的吞吐量下降。所以死锁情况是会浪费系统资源和影响计算机的使用性能的。

2、处理死锁

抢占资源: 从一个或者多个进程中抢占足够多数量的资源,分配给死锁进程,以解除死锁。

终止进程法(包括终止所有死锁进程和逐个终止进程): 终止系统中的一个或多个死锁进程,纸质打破循环环路,使系统从死锁状态中解脱出来。

进程回退法。

lock和trylock的区别

pthread_mutex_lock() 来获取锁,这种方式会使线程在无法立即获得锁时被阻塞,直到锁变为可用。这意味着每个线程在更新计数器时都需要等待,直到前一个线程释放锁。

pthread_mutex_trylock() 来尝试获取锁。如果锁当前被占用,pthread_mutex_trylock() 会立即返回一个非零值(表示获取锁失败),而不是阻塞线程。这意味着线程在无法获得锁时会选择继续循环尝试获取锁,而不是被阻塞。这种方式可能导致一些线程无法及时获取锁,从而降低了程序的效率,并且可能导致线程间的公平性问题。

time 命令 + 可执行程序:查看程序运行了多久时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值