algorithm - 最简单的投票/同步算法

标签 algorithm concurrency synchronization voting linden-scripting-language

一个或多个人可以使用什么最简单的算法来决定他们中的谁应该执行某项任务?有一个任务,只需要完成一次,一个或多个人。人们可以说话,也就是说,可以互相发送消息。通信必须最少,并且所有人都使用完全相同的算法。

一个人说“我正在做”是不够的,因为两个人可能同时说。

我想到的最简单的方法是每个人说一个数字然后稍等片刻。如果有人在那段时间做出回应,则数字较小的人“获胜”并完成任务。如果没有人回应,那人就说她正在做,并且确实做了。当她说她这样做时,其他人都会退缩。这应该足以避免两个人同时执行任务(因为有等待/握手期),但如果两个人说相同的数字,则可能需要“第二轮”。

有没有更简单的?

对于那些好奇的人,我正在尝试同步 SecondLife LSL 脚本的多个副本以仅执行一次操作。

最佳答案

这实际上取决于一个人拥有什么样的通信原语。如果有共享内存,一个compare-and-swap是一种很好、简单的方法 - 每个人都只是尝试用 1 替换 0,谁成功了就完成任务。

如果您只有消息发送功能,您可能需要实现 Paxos协议(protocol)或类似的东西。在这种情况下,要非常小心地证明您的协议(protocol)的正确性,因为它比看起来更微妙!

编辑:既然你说你正在使用 LSL,为什么不让他们使用 LlHTTPRequest 查询外部服务器呢?仲裁?如果您担心在哪里托管外部服务器,您可以使用 App Engine或者很容易的东西。

关于algorithm - 最简单的投票/同步算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/991958/

相关文章:

java - 限制最多 N 次并发调用 Java 中的静态方法

iphone - 如何在设备之间同步核心数据?

multithreading - Clojure - 有效地同时增加列表中的数字

algorithm - 4 个皇后和 1 个马攻击 8*8 棋盘上的所有方 block

php - 有人知道避免两个或多个日期时间在 php 中发生冲突的算法

c++ - Dijkstra 算法无效

java - 如何在启动 Activity 之前等待服务加载

linux - 从 sleep_on() 到 wait_event()?

Java 在原子操作上同步

algorithm - n 个变量的线性方程的解数