线程的资源回收和互斥锁

一、线程结束方式

1.pthread_exit

函数原型

#include <pthread.h> void pthread_exit(void *retval);

参数

  • retval: 这是一个指向任意类型的指针,表示线程的返回值。这个值可由其他线程通过调用 pthread_join 获取。

2.从线程执行函数中return&status;

3pthread_cancel(tid):异常结束,一般无法接受子线程返回的状态值;

函数原型

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

参数

  • thread: 这是要取消的线程的标识符(线程ID),通常通过 pthread_create 返回。

返回值

  • 返回 0 表示成功。
  • 返回一个错误码表示失败,常见的错误有:
    • ESRCH: 指定的线程不存在。
    • EINVAL: 线程ID无效。

4.任何一个线程调用了exit或者主函数return都会导致进程结束;

二、线程资源回收

1.pthread_join 自己手动回收;(线程属性:可结合属性)一般子线程在较短时间内运行完;

2.pthread_detach (tid)将线程设置为分离属性,线程会被系统自动回收(一般在创建线程后就设置,防止线程执行完毕)

三、线程和进程缺点的解决

1.线程的资源共享

临界区:访问共享资源(临界资源)的那段代码

机制:互斥锁  定义互斥锁->初始化锁->加锁->解锁 ->销锁

pthread mutex init();//初始化一把锁
pthread mutex lock();//上锁-------临界资源
pthread mutex unlock();//解锁----临界资源访问之后
pthread mutex_ destroy();//销毁一把锁

#include<stdio.h>
#include <stdio.h>
#include <pthread.h>
#include <errno.h>
#include <stdlib.h>

#define handle_error_en(en, msg) \
	do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

#define handle_error(msg) \
	do { perror(msg); exit(EXIT_FAILURE); } while (0)

int count; 
char buf[20];
pthread_mutex_t mutex;
void *doSth1(void *arg)
{
	int i = 0;
	while ( i < 10)
	{
        pthread_mutex_lock(&mutex);
		buf[i] = i + '0';
        ++i;
        pthread_mutex_unlock(&mutex);
    }
    printf("%s\n",buf);
}

void *doSth2(void *arg)
{
	int i = 0;
    char num = 'a';
	while ( i < 10)
	{
        pthread_mutex_lock(&mutex);
		buf[i] = num;
        num += 1;
        ++i;
        pthread_mutex_unlock(&mutex); 
    }
    printf("%s\n",buf);
}

int main(int argc, const char *argv[])
{
	pthread_t tid[2];
    pthread_mutex_init(&mutex,NULL);
	int ret = pthread_create(&tid[0],NULL,doSth1,NULL);
	if (ret != 0)
		handle_error_en(ret,"pthread_create fail");

	ret = pthread_create(&tid[1],NULL,doSth2,NULL);
	if (ret != 0)
	handle_error_en(ret,"pthread_create fail"); 
    pthread_join(tid[0],NULL);
    pthread_join(tid[1],NULL);
    pthread_mutex_destroy(&mutex);
	return 0;
}

2.锁是一种线程见的同步机制

互斥锁:保证线程对于共享资源的排他性访问;保证每个线程访问时的原子性操作;

死锁条件:互斥条件、不剥夺条件、请求和保持条件、循环等待条件

死锁的解决方法:

(1) 预防死锁。破坏死锁产生的四个必要条件中的一个或几个。

(2) 避免死锁。用某种方法防止系统进入不安全状态,从而避免死锁(银行家算法)

(3)死锁的检测和解除。允许死锁的发生,不过操作系统会负责检测出死锁的发生,然后采取某种措施解除死锁。

3.线程间的顺序问题(同步操作)

信号量(交通信号灯,实现一种可以让线程间有序访问临界资源的方式,可以顺序操作的一把锁)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值