【问题标题】:problem in peterson's lock in shared memory彼得森在共享内存中的锁定问题
【发布时间】:2011-06-11 20:42:59
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我应该考虑内存重新排序!总之非常感谢。我现在将使用互斥锁。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

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

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

      你能分享一下你对彼得森算法

      使用的逻辑吗

      访问:Peterson Algorithm

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-20
        • 1970-01-01
        • 2013-09-02
        • 1970-01-01
        • 2017-05-05
        • 2012-07-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多