线程基础(二):线程锁和条件变量(笔记)

来源:互联网 发布:优化游戏的软件哪个好 编辑:程序博客网 时间:2024/05/22 01:52

线程属性:

头文件#include<pthread.h>
互斥锁属性attr
int pthread_mutexattr_init(pthread_mutexattr_t *attr)
int pthread_mutexattr_destroy(pthread_mutexattr_t* attr)
成功返回0, 出错返回错误编号。
##互斥锁进程共享属性:
头文件include<pthread.h>
int pthread_mutexattr_getpshared(const pthread_mutexattr_t *restrict attr, int *restrict phared)//获得共享进程属性
int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr, int pshared)//设置共享进程属性
attr:互斥锁属性
pshared:进程共享属性
1.PTHREAD_PROCESS_PRIVATE(默认情况)
 锁只能处理一个进程内的线程进行互斥
2.PTHREAD_PROCESS_SHARED
    所可以用于两个不同进程的线程互斥
##互斥锁类型
1.标准互斥锁:PTHREAD_MUTEX_NORMAL
 第一次上锁成功,第二次上锁会阻塞
2.递归互斥锁:PTHREAD_MUTEX_RECURSIVE
 第一次上锁成功,第二次以后上锁还是成功,内部计数
3.检错互斥锁:PTHREAD_MUTEX_ERRORCHECK
 第一次上锁成功, 第二次上锁会出错(相当于标准锁的非阻塞版本)
4.默认互斥锁:PTHREAD_MUTEX_DEFAULT(等同于标准互斥锁)
##线程互斥————读写锁
1.线程使用互斥锁缺乏读的并发性
2.当读操作较多,写操作较少时,可以使用读写锁提高线程读并发性
3.读写锁数据类型:pthread_rwlock_t
##线程同步---条件变量
互斥锁的缺点是他只有两种状态:锁定和非锁定
条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足
条件变量内部是一个等待队列,放置等待的线程,线程在条件变量上等待和通知,互斥锁用来保护等待队列(对等待队列上锁),条件变量通常和互斥锁一起使用。
条件变量允许线程等待特定条件发生,当条件不满足时,线程通常先进入阻塞状态,等待条件发生变化,一旦其他某个线程改变了条件,可唤醒一个或者多个线程。
具体的判断条件还得用户给出
条件变量的数据类型pthread_cond_t
##条件变量等待操作
示例程序:
Study_self/pthread_cal.c
头文件<pthread.h>
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex)
int pthread_cond_timewait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex,const struct timespec *restrict timeout)
返回: 成功返回0, 错误返回错误编号。
struct timespec{
 time_t tv_sec; //seconds
 long tv_nsec; //nanoseconds
}
参数:
cond: 条件变量
mutex: 互斥锁
互斥锁是对条件变量cond的保护
线程由于调用wait函数阻塞,否则释放互斥锁
##条件变量通知操作
int pthread_cond_signal(pthread_cond_t *cond)
//通知单个线程
int pthread_cond_broadcast(pthread_cond_t *cond)
//通知所有线程
成功返回0, 错误返回错误编号
参数:
cond:条件变量
当条件满足时,线程需要通知等待线程
lock(&mutex);-------------------------------1
pthread_cond_wait()的内部流程:
{
 1.unlock(&mutex)//释放锁 --------------------------2
 2.lock(&mutex)//再次上锁,保护等待队列
 3.将线程自己加入到等待队列中
 4.unlock(&mutex)//释放锁
 5.当前等待的线程阻塞==>等待其他线程调用signal 和broadcast唤醒
 6.在唤醒后,lock(&mutex)//上锁(因为有用到等待队列)-----------------------3
 7.从等待队列中删除线程自己
}
unlock(&mutex)-------------------------4
//4号释放锁不是和1号相对应,而是和3号对应, 1号和2号对应
***再用到条件变量等待api的时候要特别注意锁的对应性。
阅读全文
0 0
原创粉丝点击