线程同步

多进程或多线程访问临界资源时,必须进行同步控制。多进程或多线程的执行并不完全是绝对的并行运行,有可能主线程需要等待函数线程的某些条件发生。

多线程之间有几个特殊的临界资源:全局变量、堆区数据、文件描述符。

线程间同步控制方式:

1、信号量

获取:int sem_init(sem_t *sem, int shared , int value);
          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); 

2、互斥锁: 完全控制临界资源, 如果一个线程完成加锁操作, 则其他线程无论如何 都无法再完成加锁, 也就无法对临界资源进行访问。

初始化: int pthread_mutex_init(pthread_mutex_t *mutex, pthread_mutex_attr_t *attr);
加锁: int pthread_mutex_lock(pthread_mutex_t *mutex); // 阻塞运行
            int pthread_mutex_trylock(pthread_mutex_t *mutex); //非阻塞版本
解锁: int pthread_mutex_unlock(pthread_mutex_t *mutex);
释放: int pthread_mutex_destroy(pthread_mutex_t *mutex);

3、条件变量


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,失败返回错误编码。






  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值