标签:lin 加锁线程 glib 多次 inux dead linux 释放 没有
1)初始化线程锁
静态初始化:
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
或者动态初始化:
int pthread_mutex_init(pthread_mutex_t*mutex,constpthread_mutexattr_t* attr);
其中 attr 用于指定互斥锁属性,如果为NULL则使用缺省属性。 函数成功执行后,互斥锁被初始化为未锁住态。
2)锁的操作
2.1)加锁:
int pthread_mutex_lock(pthread_mutex_t*mutex);int pthread_mutex_trylock(pthread_mutex_t*mutex);
pthread_mutex_trylock() 方式在锁被占用的时候不会阻塞,而是返回EBUSY
2.2)释放锁:
int pthread_mutex_unlock(pthread_mutex_t*mutex);
2.3)销毁锁:
int pthread_mutex_destroy(pthread_mutex_t*mutex);
销毁一个互斥锁即意味着释放它所占用的资源,且要求锁当前处于开放状态。 由于在Linux中,互斥锁并不占用任何资源,因此LinuxThreads中的 pthread_mutex_destroy() 除了检查锁状态以外(锁定状态则返回EBUSY)没有其他动作。
3)锁的属性
互斥锁的属性在创建锁的时候指定,在LinuxThreads实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。
当前(glibc2.2.3,linuxthreads0.9)有四个值可供选择:
这是缺省值,也就是普通锁。当一个线程加锁以后,其余请求锁的线程将形成一个等待队列,并在解锁后按优先级获得锁。这种锁策略保证了资源分配的公平性。
嵌套锁,允许同一个线程对同一个锁成功获得多次,并通过多次unlock解锁。如果是不同线程请求,则在加锁线程解锁时重新竞争。
检错锁,如果同一个线程请求同一个锁,则返回 EDEADLK,否则与 PTHREAD_MUTEX_TIMED_NP 类型动作相同。 这样就保证当不允许多次加锁时不会出现最简单情况下的死锁。
适应锁,动作最简单的锁类型,仅等待解锁后重新竞争。
标签:lin 加锁线程 glib 多次 inux dead linux 释放 没有
原文地址:http://www.cnblogs.com/fengbohello/p/7571722.html