C++同步锁笔记

同步机制

	线程与进程支持的同步机制:pshared参数表示共享属性线程还是进程
			线程:互斥锁,读写锁,文件锁,条件变量,自旋锁,信号量
			进程:互斥锁,读写锁,文件锁,自旋锁,信号量
	锁机制:互斥锁,读写锁,文件锁,条件变量,自旋锁,信号量

    1.互斥锁:         

        四种互斥锁:参数type表示互斥锁的类型,总共有以下四种类型:
            1.PTHREAD_MUTEX_NOMAL:标准互斥锁,第一次上锁成功,第二次上锁会失败并阻塞
            2.PTHREAD_MUTEX_RECURSIVE:递归互斥锁,第一次上锁成功,第二次上锁还会成功,可理解为内部有一计数器,每加锁加1,解锁减1
            3.PTHREAD_MUTEX_ERRORCHECK:检查互斥锁,第一次上锁会成功,第二次上锁出错返回错误信息,不会阻塞
            4.PTHREAD_MUTEX_DEFAULT:默认互斥锁,第一次上锁会成功,第二次上锁会失败


    2.读写锁:某个共享数据变量读多写少,查找的操作耗时很长,如果加锁会降低效率,所以提出读写锁,具有写独占,读共享,写锁优先级高的特性
  

        int pthread_rwlock_rdlock(pthread_rwlock_t *);获取一个读出锁,如果对应的读写锁已由某个写入者持有,那就阻塞调用线程:
        int pthread_rwlock_wrlock(pthread_rwlock_t *);获取一个写入锁,如果对应的读写锁已由另一个写入者持有,或者已由一个或多个读出者持有,就阻塞:
        int pthread_rwlock_unlock(pthread_rwlock_t *);释放一个读出锁或写入锁:
        下面两个函数尝试获取一个读出锁或写入锁,但是如果该锁不能马上取得,那就返回一个EBUSY错误,而不是把调用线程投入睡眠:
        int pthread_rwlock_tryrdlock(pthread_rwlock_t *);
        int pthread_rwlock_trywrlock(pthread_rwlock_t *);


    3.文件锁:包括建议性锁和强制性锁:

        建议性锁:要求每个使用上锁文件的进程都要检查是否有锁存在,并且尊重已有的锁。内核和系统都不使用建议性锁,依靠程序员遵守这个规定。
        强制性锁:是由内核执行的锁,文件被上锁进行写操作时,内核将阻止其他文件对其读写操作。其对性能影响很大,读写操作必须检查是否锁存在。
        文件锁的函数:fcntl()和flock()


    4.自旋锁:特殊的互斥锁,被加锁后其他线程想要再次加锁,此时该线程不阻塞睡眠而是陷入循环等待状态,减少睡眠唤醒的资源消耗,但一直占用CPU。

    5.条件变量:互斥锁主要用于上锁,而条件变量用于等待。

        静态方式:pthread_cond_t cond PTHREAD_COND_INITIALIZER
        动态方式:int pthread_cond_init(&cond,NULL)
        注销:int pthread_cond_destory(&cond)
        条件等待:int pthread_cond_wait(&cond,&mutex)
        计时等待:int pthread_cond_timewait(&cond,&mutex,time)
        激发一个等待线程:pthread_cond_signal(&cond)
        激发所有等待线程:pthread_cond_broadcast(&cond)


    6.信号量:互斥锁只允许一个线程进入临界区,而信号量允许多个线程进入临界区

        int sem_init(&sem,pshared,v) 
        int sem_wait(&sem):以原子操作的方式将信号量的值减去1
        int sem_post(&sem):以原子操作的方式将信号量的值加上1
        int sem_destory(&sem)

上一篇:c++11多线程


下一篇:Linux线程