日期:2014-05-16  浏览次数:20613 次

求解 unix的锁
strict foo *fh[NHASH]; //hash表
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;//互斥量

为什么我有一个线程锁住hashlock这个互斥量以后,其它的线程就不能对fh[NHASH]进行访问了?
hashlock和fh[NHASH]有什么关系吗?

锁住以后其它线程能不能访问fh[NHASH]是不是取决于我实现的对fh[NHASH]操作的函数所决定的?
apue我看晕乎了,求高人指点


------解决方案--------------------
这不是强制性的, 想要互斥的线程需要主动调用pthread_mutex_lock/unlock.
------解决方案--------------------
探讨
int i;
strict foo *fh[NHASH]; //hash表
pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;//互斥量



fh[NHASH]和hashlock没有什么联系的话,如果是再添加一个变量i,是不是也可以通过hashlock锁住对变量i的操作?

------解决方案--------------------
互斥量hashlock是用来保护临界资源fh[NHASH]不被两个或多个进程访问的; 
 如果,你不把hashlock和fh[NHASH]放在仪器,那么两者没有任何关系;
 你想保护i被互斥访问,只要将i也放进互斥量保护的代码段,也可以实现互斥访问;

 保护的机制非常简单,对hashlock的操作是原子操作,如果有一个进程访问fh[NHASH],就让hashlock=0;
 别的进程发现 hashlock==0,就无法再访问fh[NHASH]。前一个进程,访问结束后,恢复hashlock=1,于是,正在等待访问的进程就可以被唤醒,而进行访问了。
可见,有了互斥量hashlock就可以保护资源fh[NHASH]不被两个或以上的进程访问。
------解决方案--------------------
一个是锁,一个是资源
两者其实没有必然的联系

多个进程/线程互斥访问资源完全是一种君子行为
------解决方案--------------------
探讨
不是防止被两个线程吗?互斥量保护的代码段是不是和它在一个作用域里呀?如果在函数里我不去判断hashlock的值,是不是也可以访问fh[NHASH]?

------解决方案--------------------
探讨
这样的话,我们就可以自己定义一个锁了,就定义一个int类型的做标记。如果正在访问就把它置1,没有访问就置0,这不就成了互斥锁了吗

------解决方案--------------------
另外,互斥量的定义,还包含一个阻塞的队列,不是一个简单的整形数或一个布尔量。