互斥锁
-
互斥锁用来保证一段时间内只有一个线程在执行一段代码(保证共享数据的完整性)
-
互斥锁变量
typedef union{ struct __pthread_mutex_s __data; char __size[__SIZEOF_PTHREAD_MUTEX_T]; long int __align; } pthread_mutex_t;
-
互斥锁的生成
/* Initialize a mutex. */ extern int pthread_mutex_init (pthread_mutex_t *__mutex, const pthread_mutexattr_t *__mutexattr) __THROW __nonnull ((1));
用于动态创建一个互斥锁,第一个参数为互斥锁指针,第二个参数为互斥锁属性(通常传
NULL
表示默认属性)
互斥锁属性
-
属性结构
/* Data structures for mutex handling. The structure of the attribute type is not exposed on purpose. */ typedef union{ char __size[__SIZEOF_PTHREAD_MUTEXATTR_T]; int __align; } pthread_mutexattr_t;
互斥锁属性使用上面的联合体存放,通过函数
pthread_mutexattr_setpshared()
设置范围属性, -
范围属性
/* Process shared or private flag. */ enum{ PTHREAD_PROCESS_PRIVATE,//同进程中线程同步 #define PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_PRIVATE PTHREAD_PROCESS_SHARED //不同进程中的线程同步 #define PTHREAD_PROCESS_SHARED PTHREAD_PROCESS_SHARED };
-
类型属性
通过函数pthread_mutexattr_settype()
(通常使用默认属性PTHREAD_MUTEX_DEFAULT
)/* Mutex types. */ enum{ //缺省值,普通锁,当一个线程加锁以后,其余请求锁的线程将会形成一个等待队列 //并在解锁后按照先后顺序获得锁,资源分配公平 PTHREAD_MUTEX_TIMED_NP, //嵌套锁,允许同一线程对同一锁成功获得多次,并通过多次unlock解锁 //如果是不同线程请求,则在加锁线程解锁时重新竞争 PTHREAD_MUTEX_RECURSIVE_NP, //检错锁,如果同一线程请求同一个锁,则返回EDEALK //否则与普通锁类型动作相同,这样保证当不允许多次时,不会出现最简单的死锁 PTHREAD_MUTEX_ERRORCHECK_NP, //适应锁,动作最简单的类型,仅等待解锁以后重新竞争 PTHREAD_MUTEX_ADAPTIVE_NP #if defined __USE_UNIX98 || defined __USE_XOPEN2K8 , PTHREAD_MUTEX_NORMAL = PTHREAD_MUTEX_TIMED_NP