分类:
2008-12-16 10:20:13
12.4 synchronization
attributes
#include int pthread_mutexattr_init(pthread_mutexattr_t *attr); int pthread_mutexattr_destroy(pthread_mutexattr_t *attr); |
Both return: 0 if OK, error number on failure |
这里讲述一些涉及到synchronization 的机制的属性,如mutex的属性,readerwriter
lock的属性,condition
variable的属性。
Mutex的属性包括:
1.Process
shared属性,即该mutex是否可以在进程之间共享,以用来保护进程之间共享的资源。这个属性并不是posix.1的强制规定,可以支持也可以不支持。一般来说,一个mutex默认是PTHREAD_MUTEX_PRIVATE,即只在进程内部的线程之间共享,如果该mutex在一段进程之间共享的内存上分配,并且被设置了PTHREAD_MUTEX_SHARED,那么他就可以被多个进程用来保护进程间共享的资源。
#include int pthread_mutexattr_getpshared(const pthread_mutexattr_t * restrict
attr, int *restrict pshared); int pthread_mutexattr_setpshared (pthread_mutexattr_t *attr, int
pshared); |
Both return: 0 if OK, error number on failure |
2. mutex type属性,规定了mutex的类别,不同的类别的mutex在使用的时候有不同的效果:默认的类型是PTHREAD_MUTEX_DEFAULT, 在不同的实现中, 其实这个值对应的就是上面那几个,linux中,对应的是PTHREAD_MUTEX_NORMAL。PTHREAD_MUTEX_NORMAL.其中,
PTHREAD_MUTEX_RECURSIVE是一个很好的类型。如果不是这种类型的锁,你一旦已经加了锁,再次枷锁,就会死锁住。而recursive类型的锁可以保证你不会死锁,当然你要释放相同的次数,才能真正将所释放。其用途多是在将single threaded程序改成multi
threaded的程序中使用,因为这种程序大多会出现一些你不敢确认函数调用关系的情况,而且这些函数都要枷锁,那么有可能这些函数就会recursive加锁。
Figure 12.5. Mutex type behavior |
|||
Mutex type |
Relock without unlock? |
Unlock when not owned? |
Unlock when unlocked? |
PTHREAD_MUTEX_NORMAL |
deadlock |
undefined |
undefined |
PTHREAD_MUTEX_ERRORCHECK |
returns error |
returns error |
returns error |
PTHREAD_MUTEX_RECURSIVE |
allowed |
returns error |
returns error |
PTHREAD_MUTEX_DEFAULT |
undefined |
undefined |
undefined |
#include int pthread_mutexattr_gettype(const pthread_mutexattr_t * restrict attr, int *restrict type); int pthread_mutexattr_settype(pthread_mutexattr_t *attr, int type); |
Both return: 0 if OK, error number on failure |
同理,readerwriter lock 和condition
variable都有类似的操作,他们都可以支持process shared属性,即支持对process 之间的资源共享控制。