多进程或多线程访问临界资源时,必须进行同步控制。多进程或多线程的执行并不完全是绝对的并行运行,有可能主线程需要等待函数线程的某些条件发生。
多线程之间有几个特殊的临界资源:全局变量、堆区数据、文件描述符。
线程间同步控制方式:
1、信号量
sem: 是一个sem_t类型指针, 指向信号量对象;
shared:是否能在多进程间共享,Linux不支持设为0;
value: 信号量的初始值。
成功返回0,失败返回-1.
P 操作: int sem_wait(sem_t *sem);
V 操作: int sem_post(sem_t *sem);
删除: int sem_destroy(sem_t *sem);
4、读写锁
读写锁有三种状态:读模式下加锁状态、写模式下加锁状态、不加锁状态。一次只有一个线程可以占有写模式的读写锁,但是多个线程可以同时占有读模式的读写锁。
写加锁状态时,在这个被解锁状之前,所有试图对这个锁加锁的线程都会被阻塞;
读加锁状态时,所有试图以读模式对它加锁的线程都可以得到访问权,如果试图以写模式加锁,必须等待所有的线程释放读锁。
当读写锁处于读模式锁住状态时,如果有线程以写模式加锁,通常会阻塞后边的读模式锁请求。避免读模式锁长期占用,而等待的写模式锁一直得不到满足。
初始化:int pthread_rwlock_init(pthread_rwlock_t *rwlock,const pthread_rwlockattr_t *attr);
rwlock:锁标识符;
attr:属性,设置默认属性传NULL。
销毁:int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
上边两个函数成功返回0,失败返回-1。
读模式下锁定读写锁:int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
写模式下锁定读写锁:int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
解锁:int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
上边三个函数,成功返回0,失败返回错误编码。