Linux 下C语言多线程编程--互斥锁

互斥锁

  • 互斥锁用来保证一段时间内只有一个线程在执行一段代码(保证共享数据的完整性)

  • 互斥锁变量

    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
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值