标签:
POSIX线程同步方法有:POSIX信号量、互斥锁和条件变量。
互斥锁可以用于保护关键代码段,以确保其独占式的访问。当进去关键代码段时,我们需要获得互斥锁并将其加锁,等价于二进制信号量的P操作,当离开关键代码段时,我们需要对其解锁,等价于二进制信号量中的V操作。
互斥锁基础API:
互斥锁属性,一些api来获取和设置互斥锁属性:
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。
产生死锁的条件有四个:
1.互斥条件:所谓互斥就是进程在某一时间内独占资源。
2.请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
3.不剥夺条件:进程已获得资源,在末使用完之前,不能强行剥夺。
4.循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。例如:多线程访问共享资源,由于访问的顺序不当所造成的,通常是一个线程锁定了一个资源A,而又想去锁定资源B;在另一个线程中,锁定了资源B,而又想去锁定资源A以完成自身的操作,两个线程都想得到对方的资源,而不愿释放自己的资源,造成两个线程都在等待,而无法执行的情况。
下面的程序,主线程占有mutex_a,等带mutex_b,而子线程占有mutex_b,等待mutex_a,造成死锁,由于死锁,程序将不能退出。
code: https://github.com/panzhengguang/Unix_Net_Programming/tree/master/pthread
#include <pthread.h> #include <unistd.h> #include <stdio.h> int a = 0; int b = 0; pthread_mutex_t mutex_a; pthread_mutex_t mutex_b; void* another( void* arg ) { pthread_mutex_lock( &mutex_b ); printf( "in child thread, got mutex b, waiting for mutex a\n" ); sleep( 5 ); ++b; pthread_mutex_lock( &mutex_a ); b += a++; pthread_mutex_unlock( &mutex_a ); pthread_mutex_unlock( &mutex_b ); pthread_exit( NULL ); } int main() { pthread_t id; pthread_mutex_init( &mutex_a, NULL ); pthread_mutex_init( &mutex_b, NULL ); pthread_create( &id, NULL, another, NULL ); pthread_mutex_lock( &mutex_a ); printf( "in parent thread, got mutex a, waiting for mutex b\n" ); sleep( 5 ); ++a; pthread_mutex_lock( &mutex_b ); a += b++; pthread_mutex_unlock( &mutex_b ); pthread_mutex_unlock( &mutex_a ); pthread_join( id, NULL ); pthread_mutex_destroy( &mutex_a ); pthread_mutex_destroy( &mutex_b ); return 0; }
标签:
原文地址:http://www.cnblogs.com/panweishadow/p/4401099.html