进程间线程间的同步锁原理和种类

同步锁的基本原理:
锁基本都是内核对象,用于控制多线程间多进程间的同步访问。
我们知道进程间的同步操作都是要借助内核来完成的,和同一个进程中的线程同步只需要在用户模式下是有很大差别的,当然,对于进程安全的,对于线程肯定也是 安全的,但在用户模式下的线程同步所需消耗的代价相对于通过内核完成的同步是很小的。所以不要利用进程同步的方式来进行同一进程中线程的同步。
同步锁的种类:
互斥量和条件变量。
读写锁,记录锁/文件锁。
信号量。

1.互斥量mutex和条件变量:
lock_the_mutex  //没有获得锁,也会在此阻塞不会浪费CPU轮询
unlock_the_mutex(...);
条件变量:
条件变量,当获取锁后但是条件失败,那么会释放当前锁(另外的线程可以获得锁,以解除死锁),然后在此阻塞(避免条件判断需要不但轮询浪费CPU时间)

pthread_mutex_lock(&mutex); 

  while(条件为假)//当条件不满足时候,解除死锁

    pthread_cond_wait(&cond,&mutex); // 此处会阻塞,不会浪费CPU资源

  //..执行某种操作

  pthread_mutex_unlock(&mutex);


pthread_mutex_lock(&mutex);

  //..设置条件为真

  pthread_cond_signal(&cond);  //发送信号,唤醒上述的pthread_cond_wait

  pthread_mutex_unlock(&mutex); 


2. 读写锁:
读写锁将锁分为读锁和写锁,是对同步访问方式的划分
多个线程同步访问一个文件内存都用读锁,那么可以都申请成功。
只要有一个线程申请或拥有写锁,其它线程申请或拥有读锁或者写锁,那么申请写锁的必须等待,或者其它线程申请锁必须等待。

3.记录锁/文件锁
记录锁和文件锁是在锁定的内容粒度上面的划分
记录锁可以锁定文件内存的指定位置的内容上锁,这样内容没有交集的地方,多个线程间访问不用使用同步。
文件锁是锁上整个文件内存,是记录锁的特例。

4.信号量
信号量与互斥锁+条件变量相似,它会有一个能否获取锁的判断,获取后判断条件不满足会释放锁,条件满足了又会唤醒等待条件继续获取锁和判断条件;还有指明当前可用资源个数的功能,当拥有个数时才能申请锁成功,0个资源的时候只能等待。当资源个数只能取0和1时候和互斥锁+条件变量一样了。信号量的发明主要是在于进程间的,互斥锁+条件变量主要是用于线程间的,但这些锁都可以用于线程间也都可以用于进程间。
基于内存的信号量一般用于线程间同步; 它是一个进程内堆变量,,随进程的持续性,必须在创建时指定是否在进程间共享(如果为进程间那么变为内核堆变量)。
基于有名信号量一般用于进程间同步;它是一个内核堆变量,随内核有持续性,需手工删除。

主要函数有:

      sem_open、sem_close、sem_unlink,close只是关闭信号量,但并未从系统中删除,而unlink是删除该信号量。

    sem_wait和sem_trywait函数,他们和pthread_cond_wait功能相似,都是等待某个条件的成 立。

sem_wait和sem_trywait的区别是,前者是阻塞的,后者是非阻塞的;当所指定的信号量的值为0时,后者并不将调用者投入睡眠,而是立刻返回EAGAIN,即重试。

   sem_post函数,sem_post将指定的信号量加一,然后唤醒正在等待该信号量值变为正数的任意线程。

      sem_getvalue函数,是用来获取当前信号量值的函数。


参考文章:

http://www.cnblogs.com/yangshaoning/archive/2012/03/13/thread_process_synchronization.html
http://blog.csdn.net/ccskyer/article/details/6096710
http://www.cnblogs.com/cuish/p/4136391.html


你可能感兴趣的:(多线程多进程)