Nea*_*eal 2 c++ java-native-interface locking shared-memory mutual-exclusion
我已经在共享内存中实现了彼得森的互斥算法。我在 c++ 和 java 进程(使用 jni)之间使用共享内存进行通信。问题是我仍然以某种方式看到竞争条件。如果我尝试使用 printf/println 调试它,代码开始运行良好,但是一旦我删除这些打印件,进程就会停止。有人可以请教我问题出在哪里吗?我很确定彼得森算法的实现是正确的。我应该使用 semaphores(semget()) 来代替互斥吗?
要正确实现算法,您必须使用屏障来确保按照您在代码中指定的顺序读取/写入内存。从这里阅读第二段:
大多数现代 CPU 对内存访问进行重新排序以提高执行效率(请参阅内存排序以了解允许的重新排序类型)。这样的处理器总是提供某种方式来强制对内存访问流进行排序,通常是通过内存屏障指令。在对内存访问进行重新排序的处理器上实现 Peterson 算法和相关算法通常需要使用此类操作才能正常工作,以防止顺序操作以不正确的顺序发生。请注意,即使在不重新排序指令的处理器上(例如 Xbox 360 中的 PowerPC 处理器),内存访问的重新排序也可能发生。
是的,使用系统提供的同步机制(互斥锁)而不是重新发明轮子。
| 归档时间: |
|
| 查看次数: |
966 次 |
| 最近记录: |