在外部模块中使用互斥锁

时间:2011-05-10 15:13:10

标签: pthreads mutex

如果我有一个具有互斥锁的模块,并且我在互斥锁上使用锁定/解锁来写入int变量的值,那么在一个线程中运行的另一个模块中,相同的互斥锁是如何锁定/解锁的?

外部模块还需要写入变量的值,这是在线程循环函数中完成的。如何使用相同的互斥锁或使用另一个互斥锁来锁定它?

如果2个不同的互斥锁锁定相同的内存段(不一定同时),会发生什么?

1 个答案:

答案 0 :(得分:3)

为了使用pthreads共享互斥锁,您将不得不通过指针以某种方式共享互斥锁的地址,或者使互斥锁成为全局可访问的变量。

互斥锁或信号量本身不会锁定给定的内存或关键代码段...而是锁定对内存中特定“标志”或位置的访问(即,像unsigned long或其他某种POD类型)然后用于确定对关键部分或其他全局可访问内存位置的访问。换句话说,一旦一个线程“拥有”一个给定的互斥锁,它就可以访问一段代码或内存部分,在拥有线程的锁定期间,任何其他尝试获取该相同互斥锁所有权的线程都会被阻止。

如果使用两个不同的互斥锁阻止访问给定位置,则不提供对实际内存段的互斥访问...不共享互斥锁的每个线程将具有对内存段的相同访问权限,即使他们可能都拥有对各自互斥锁的所有权锁定。因此,内存段并没有真正受到保护......两个线程可以同时访问内存段,从而产生并发问题。

再说一次,如果你有不同的模块或线程,并且你想拥有对代码或内存的给定部分的独占访问权限,那么你将不得不在这些部分之间共享相同的互斥体元素。有很多方法可以做到,或者像命名信号量那样,如果你需要为多个单独的进程执行此操作,或者通过共享内存段(即shmget()shmat(),{{如果你不能以某种方式共享一个全局可访问的互斥锁或指针,因为模块之间的地址空间有些分离。