当前位置: 技术问答>linux和unix
求解 unix的锁
来源: 互联网 发布时间:2017-01-26
本文导语: strict foo *fh[NHASH]; //hash表 pthread_mutex_t hashlock = PTHREAD_MUTEX_INITIALIZER;//互斥量 为什么我有一个线程锁住hashlock这个互斥量以后,其它的线程就不能对fh[NHASH]进行访问了? hashlock和fh[NHASH]有什么关系吗? 锁住以...
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_t hashlock = PTHREAD_MUTEX_INITIALIZER;//互斥量
为什么我有一个线程锁住hashlock这个互斥量以后,其它的线程就不能对fh[NHASH]进行访问了?
hashlock和fh[NHASH]有什么关系吗?
锁住以后其它线程能不能访问fh[NHASH]是不是取决于我实现的对fh[NHASH]操作的函数所决定的?
apue我看晕乎了,求高人指点
|
一个是锁,一个是资源
两者其实没有必然的联系
多个进程/线程互斥访问资源完全是一种君子行为
两者其实没有必然的联系
多个进程/线程互斥访问资源完全是一种君子行为
|
这不是强制性的, 想要互斥的线程需要主动调用pthread_mutex_lock/unlock.
|
这看你程序具体情况具体分析, 你先理解这些东西才能运用, 这样问也没什么用.
|
互斥量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]放在仪器,那么两者没有任何关系;
你想保护i被互斥访问,只要将i也放进互斥量保护的代码段,也可以实现互斥访问;
保护的机制非常简单,对hashlock的操作是原子操作,如果有一个进程访问fh[NHASH],就让hashlock=0;
别的进程发现 hashlock==0,就无法再访问fh[NHASH]。前一个进程,访问结束后,恢复hashlock=1,于是,正在等待访问的进程就可以被唤醒,而进行访问了。
可见,有了互斥量hashlock就可以保护资源fh[NHASH]不被两个或以上的进程访问。
|
如果不判断hashlock,就去访问,那就意味可能发生冲突。程序员应该避免这样做。
为了防止这种现象,也可以将互斥量和与其保护的代码段封装在一起,这样就不会发生意外了。
|
自己定义的锁,不属于原子操作,所以必须使用系统的类型定义,例如:pthread_mutex_t等。
|
另外,互斥量的定义,还包含一个阻塞的队列,不是一个简单的整形数或一个布尔量。