2

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

4

3 回答 3

5

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

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

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

于 2011-06-11T20:49:40.337 回答
0

我认为您的问题与互斥无关,而是与同步化有关。彼得森算法只保证一个进程在临界区,不保证哪些进程应该在临界区。如果你的问题是正确的,我建议使用Moniter 作为sycronyzing。

于 2012-03-20T01:30:42.460 回答
0

您的代码中应该有一些由两个进程共享的关键部分。当您在没有锁定的情况下运行程序时,输出会有所不同且模棱两可,因此我们可以验证您的代码是否正常工作。

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

你能分享你对彼得森算法使用的逻辑吗

访问:彼得森算法

于 2017-09-07T08:01:23.547 回答