Linux 同步的一些理解

读写锁

1、只要没有线程持有某个给定的读写锁用于写,那么任意数目的线程可以持有该读写锁用于读。
2、仅当没有线程持有该给定的读写锁用于读或者写时,才能分配该读写锁用于写

这种对于给定的某个资源的共享访问称为 共享--独占上锁。获取一个读写锁用于读称为共享锁,获取一个读写锁用于写称为独占锁。

读写锁的数据类型为pthread_rwlock_t
静态初始化 pthread_rwlock_t rwlock = PTHREAD_RWLOCK_INITIALIZER

#include <pthread.h>

int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr);/*获取共享锁,如果有别的线程占用独占锁,则阻塞*/
int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr);/*获取独占锁,如果有别的线程占有读写锁,则阻塞*/
int pthread_rwlock_unlock(pthread_rwlock_t *rwptr);/*释放锁*/
int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwptr);
int pthread_rwlock_trywrlock(pthread_rwlock_t *rwptr);

尝试获得读写锁,如果不成功,则返回 EBUSY;

int pthread_rwlock_init(pthread_rwlock_t *rwptr, const pthread_rwlockattr_t *attr);
int pthread_destory(pthread_rwlock_t *rwptr);
初始化读写锁的属性对象
int pthread_rwlockattr_init(pthread_relockattr_t *attr);
int pthread_rwlockattr_destory(pthread_relockattr_t *attr);
目前只有唯一属性,进程间共享
PTHREAD_PROCESS_SHARED;

信号量

信号量提供不同进程间或者是不同线程间用于同步的原语
2值信号量可用于互斥,相当于互斥锁。

sem_wait(&sem)           pthread_mutex_lock(&mutex)
临界区                    临界区
sem_post(&sem)           pthread_mutex_unlock(&mutex)
wait 是等待,该操作会测试信号量的值,如果其值 小于或者等于0 则会阻塞。一旦其值变为大于0,他就减1
post 是挂出,将信号量的值加 1

#include <semaphore.h>
sem_t * sem_open(const chat *name, int oflag, mode_t mode, unsigened int value);
int sem_close(sem_t *sem);
int sem_wait(sem_t *sem);
int sem_trywait(sem_t *sem);
int sem_getvalue(sem_t *sem, int *pvalue);获取当前信号的的信号值,并把值保存到pvalue中

条件变量

pthread_cond_t = PTHREAD_COND_INITIALIZER
pthread_cond_wait(&ready.cont, &ready.mutex);
pthread_cond_signal(&(ready.cont));
简要说明自己理解的pthread_cond_wait

此函数分为两个阶段,第一阶段是等待,等待条件来进行触发,此时线程进入到条件变量的等待队列中,然后释放锁。第二阶段是条件触发完成,系统内核已通知线程启动此时线程等待别的线程释放互斥锁,函数内部完成获取锁的操作。线程开始运行,因此 在此函数的前后要 进行获取锁 和 释放锁的操作

eg:

pthread_mutex_lock(&(ready.mutex));
    while (ready.nReady == 0)
    {
        pthread_cond_wait(&ready.cont, &ready.mutex);
    }

    ready.nReady--;
    printf("%d\n", buff[put.nIndex]);
    pthread_mutex_unlock(&(ready.mutex));

互斥锁

互斥锁主要是起到锁的作用。

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex);
pthread_mutex_unlock(&mutex);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值