Linux 同步的一些理解

来源:互联网 发布:python opencv 二值化 编辑:程序博客网 时间:2024/06/05 19:52

读写锁

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_INITIALIZERpthread_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);


0 0
原创粉丝点击