linux互斥锁笔记
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?
? ? ? ??
?
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!