Chinaunix首页 | 论坛 | 博客
  • 博客访问: 969006
  • 博文数量: 200
  • 博客积分: 5011
  • 博客等级: 大校
  • 技术积分: 2479
  • 用 户 组: 普通用户
  • 注册时间: 2008-06-27 15:07
文章分类

全部博文(200)

文章存档

2009年(12)

2008年(190)

我的朋友

分类:

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的属性包括:

1Process 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_NORMALPTHREAD_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 之间的资源共享控制。

阅读(1688) | 评论(0) | 转发(0) |
0

上一篇:12.3 thread attributes

下一篇:12.5 reentrancy

给主人留下些什么吧!~~