1.函数接口:
1.pthread_exit
void pthread_exit(void *retval);
功能:
线程退出
参数:
retval:线程退出时的值
返回值:
缺省
2.pthread_join
int pthread_join(pthread_t thread, void **retval);
功能:
回收线程空间
参数:
thread:回收线程的ID
retval:存放线程结束值的空间首地址
返回值:
成功返回0
失败返回非0
注意:
1.pthread_join具有阻塞功能,线程不结束会一直阻塞等待
2.pthread_join具有同步的功能
2.线程的分离属性:
1.分离属性优点: 线程结束时可以自动回收线程空间,避免多线程回收时阻塞引发僵尸线程的问题
2.加入属性优点: 可以实现线程的同步,获得线程结束的状态
3.函数接口:
pthread_attr_init
int pthread_attr_init(pthread_attr_t *attr);
功能:
初始化线程属性
参数:
attr:设置属性空间首地址
返回值:
成功返回0
失败返回非0
pthread_attr_destroy
int pthread_attr_destroy(pthread_attr_t *attr);
功能:
销毁线程属性
pthread_attr_setdetachstate
int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
功能:
设置线程属性
参数:
attr:属性空间首地址
detachstate:
PTHREAD_CREATE_DETACHED 分离属性
PTHREAD_CREATE_JOINABLE 加入属性(阻塞属性)
返回值:
成功返回0
失败返回非0
练习:
定义一个学生的类型:
struct student
{
char name[32];
char sex;
int age;
int score;
};
创建两个线程任务,线程1负责从终端接收学生的信息,
线程2负责将接收到的学生的信息打印在终端
3.线程间通信:
1.两个任务同时操作一个资源会引入资源的竞争
2.资源:
CPU、内存、变量、代码这些都可以看成是资源
3.原子操作:
一次最小的操作(不能被CPU任务调度所打断的最小操作)
4.临界代码(临界区):
不会被CPU同时执行的代码区域
4.互斥锁:
1.引入互斥锁解决资源竞争的问题
2.在操作资源前上锁,操作资源后解锁
3.函数接口:
pthread_mutex_init
int pthread_mutex_init(pthread_mutex_t *restrict mutex,
const pthread_mutexattr_t *restrict attr);
功能:
初始化互斥锁
参数:
mutex:互斥锁空间首地址
attr:互斥锁属性,默认传递NULL
pthread_mutex_destroy
int pthread_mutex_destroy(pthread_mutex_t *mutex);
功能:
销毁互斥锁
参数:
mutex:互斥锁空间首地址
pthread_mutex_lock
int pthread_mutex_lock(pthread_mutex_t *mutex);
功能:
互斥锁上锁
pthread_mutex_unlock
int pthread_mutex_unlock(pthread_mutex_t *mutex);
功能:
互斥锁解锁
5.死锁:
1.多进程间通信由于加锁问题导致多任务均无法向下执行的状态称为死锁
2.死锁产生的4个必要条件:
1.互斥条件
2.不可剥夺条件
3.请求保持
4.循环等待
3.避免产生死锁:
1.多个线程任务加锁顺序保持一致
2.pthread_mutex_trylock 替换 pthread_mutex_lock