一、线程结束方式
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.线程间的顺序问题(同步操作)
信号量(交通信号灯,实现一种可以让线程间有序访问临界资源的方式,可以顺序操作的一把锁)