C++锁

作者: 宋大壮 | 来源:发表于2019-03-19 11:26 被阅读0次

锁的种类

互斥锁、条件锁、自旋锁、读写锁、递归锁。

互斥锁

头文件:<pthread.h>

类型:pthread_mutex_t,

函数:
pthread_mutex_init(pthread_mutex_t * mutex, const phtread_mutexattr_t * mutexattr);
动态方式创建锁,相当于new动态创建一个对象
pthread_mutex_destory(pthread_mutex_t *mutex)
释放互斥锁,相当于delete
pthread_mutex_lock(pthread_mutex_t *mutex)//以阻塞方式运行的。如果之前mutex被加锁了,那么程序会阻塞在这里。
pthread_mutex_unlock(pthread_mutex_t *mutex)
int pthread_mutex_trylock(pthread_mutex_t * mutex);//会尝试对mutex加锁。如果mutex之前已经被锁定,返回非0,;如果mutex没有被锁定,则函数返回并锁定mutex

条件变量

常见的在线程池中,起初没有任务时任务队列为空,此时线程池中的线程因为“任务队列为空”这个条件处于阻塞状态。一旦有任务进来,就会以信号量的方式唤醒一个线程来处理这个任务。这个过程中就使用到了条件变量pthread_cond_t。

头文件:<pthread.h>

类型:pthread_cond_t

函数:pthread_cond_init(pthread_cond_t * condtion, const phtread_condattr_t * condattr);//对条件变量进行动态初始化,相当于new创建对象
pthread_cond_destory(pthread_cond_t * condition);//释放动态申请的条件变量,相当于delete释放对象
pthread_cond_t condition = PTHREAD_COND_INITIALIZER;//静态初始化条件变量
pthread_cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex);//该函数以阻塞方式执行。如果某个线程中的程序执行了该函数,那么这个线程就会以阻塞方式等待,直到收到pthread_cond_signal或者pthread_cond_broadcast函数发来的信号而被唤醒。
注意:pthread_cond_wait函数的语义相当于:首先解锁互斥锁,然后以阻塞方式等待条件变量的信号,收到信号后又会对互斥锁加锁。

惊群问题

//TODO

自旋锁

自旋锁是一种用于保护多线程共享资源的锁,与一般的互斥锁(mutex)不同之处在于当自旋锁尝试获取锁的所有权时会以忙等待(busy waiting)的形式不断的循环检查锁是否可用。在多处理器环境中对持有锁时间较短的程序来说使用自旋锁代替一般的互斥锁往往能提高程序的性能。

读写锁

任意读线程可以同时访问关键区域,但是只允许一个线程写入。

读写锁机制:

写者:写者使用写锁,如果当前没有读者,也没有其他写者,写者立即获得写锁;否则写者将等待,直到没有读者和写者。
读者:读者使用读锁,如果当前没有写者,读者立即获得读锁;否则读者等待,直到没有写者。

读写锁特性:

1、同一时刻只有一个线程可以获得写锁,同一时刻可以有多个线程获得读锁。
2、读写锁出于写锁状态时,所有试图对读写锁加锁的线程,不管是读者试图加读锁,还是写者试图加写锁,都会被阻塞。
3、读写锁处于读锁状态时,有写者试图加写锁时,之后的其他线程的读锁请求会被阻塞,以避免写者长时间的不写锁。

读写锁基本函数:

读写锁初始化:
int pthread_rwlock_init(pthread_rwlock_t * rwlock,
const pthread_rwlockattr_t * attr);
该函数第一个参数为读写锁指针,第二个参数为读写锁属性指针。函数按读写锁属性对读写锁进行初始化。
加读锁:
int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于对读写锁加读锁。
加写锁:
int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于对读写锁加写锁。
释放读写锁:
int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于释放读写锁,包括读锁与写锁。
销毁读写锁:
int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);
该函数参数为读写锁指针。函数用于销毁读写锁。

递归所(重入锁)

Mutex可以分为递归锁(recursive mutex)和非递归锁(non-recursive mutex)。可递归锁也可称为可重入锁(reentrant mutex),非递归锁又叫不可重入锁(non-reentrant mutex)。
二者唯一的区别是,同一个线程可以多次获取同一个递归锁,不会产生死锁。而如果一个线程多次获取同一个非递归锁,则会产生死锁。

Windows下的Mutex和Critical Section是可递归的。Linux下的pthread_mutex_t锁默认是非递归的。可以显示的设置PTHREAD_MUTEX_RECURSIVE属性,将pthread_mutex_t设为递归锁。

linux中

pthread_mutex_t  Mutex;
pthread_mutexattr_t attr;

pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
pthread_mutex_init(&Mutex, &attr);

相关文章

  • C++锁

    锁的种类 互斥锁、条件锁、自旋锁、读写锁、递归锁。 互斥锁 头文件: 类型:pthread_mutex_t, 函数...

  • 线程安全及实现原理

    一、基本概念 锁(重量级锁)是什么?每个对象实例都有一个monitor(C++实现), synchronize对象...

  • c++ 线程锁

  • C++ 线程锁

    多线程共享数据线程锁 std::condition_variable 等待一个条件的满足

  • leetcode第1114题:按顺序打印

    题目描述 考点 多线程 代码实现 注意利用了c++标准模板库中:mutex库; 参考资料 c++之多线程中“锁”的...

  • C++ 读锁和写锁

    读锁 所用到的数据结构是读写锁,初始化之后,即可以当读锁,又可以当写锁。 结果如下 写锁 结果如下

  • C++ 线程锁理解

    1、分类 线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能与性能成反比。不过我们一般不使...

  • c++实现读写锁

    1.源码实现 2.编译源码 3.运行及其结果

  • 多线程互斥锁

    c++之多线程中“锁”的基本用法unique_lock比lock_guard多的功能函数

  • Android 多线程

    目录 AsyncTask使用和源码分析: 线程同步-锁: linux c/c++多线程看了肯定懂: 正文 一 多线...

网友评论

      本文标题:C++锁

      本文链接:https://www.haomeiwen.com/subject/wdzwmqtx.html