彼得森锁定共享内存的问题

时间:2011-06-11 20:43:00

标签: c++ locking java-native-interface shared-memory mutual-exclusion

我已经在共享内存中实现了彼此排除的peterson算法。我在c ++和java进程(使用jni)之间使用共享内存进行通信。问题是我仍然以某种方式看到了竞争条件。如果我尝试使用printf / println调试它,代码开始运行正常,但是一旦我删除这些打印,进程就会停止。 有人可以告诉我哪里可能是问题?我很确定彼得森算法的实现是正确的。 我应该使用信号量(semget())代替互斥吗?

3 个答案:

答案 0 :(得分:4)

要正确实现算法,必须使用障碍确保按照您在代码中指定的顺序读取/写入内存。阅读here中的第二段:

  

大多数现代CPU重新排序内存访问以提高执行效率(请参阅允许的重新排序类型的内存排序)。这样的处理器总是提供某种方式来强制在存储器访问流中进行排序,通常是通过存储器屏障指令。在对存储器访问重新排序的处理器上实现Peterson和相关算法通常需要使用这些操作来正确地工作以使顺序操作不以错误的顺序发生。请注意,即使在不重新排序指令的处理器(例如Xbox 360中的PowerPC处理器)上也可能发生内存访问的重新排序。

是的,使用系统提供的同步机制(互斥锁)而不是重新发明轮子。

答案 1 :(得分:0)

我认为你的问题与不是互斥而是同化有关。 Peterson算法仅确保一个进程处于关键区域,并且不保证哪些进程应处于关键区域。 如果你提出的问题是正确的,我建议使用Moniter作为sycronyzing。

答案 2 :(得分:0)

您的代码中应该存在一些由该进程共享的关键部分。当你运行没有锁定的程序时,输出将是不同的和不明确的,因此我们可以验证你的代码是否正常工作。

问题是你正在使用print语句,当你删除它们时,应该有共享的东西。

您能否分享您使用的逻辑 PETERSON的算法

访问:Peterson Algorithm