algorithm - 没有原子 CAS 的快速线程排序算法

标签 algorithm multithreading language-agnostic

我正在寻找一种方法,让我可以将序号 0..(N-1) 分配给 N 个 O/S 线程,以便线程按数字顺序排列。也就是说,获取的线程将比序号为 1 的线程具有更低的 O/S 线程 ID。

为了执行此操作,线程通过共享内存空间进行通信。

内存排序模型使得写入将是原子的(如果两个并发线程同时写入一个内存位置,结果将是一个或另一个)。该平台将不支持原子比较和设置操作。

我正在寻找一种算法,该算法在共享内存的写入次数方面非常高效,并且可以在多达数万个线程的情况下快速完成,并且不会出现糟糕的线程到达情况。

操作系统将在整个 32 位空间中以任意顺序分配线程号。可能存在任意线程创建延迟 - 当所有 N 个线程都存在时,可以认为算法已完成。

我无法使用明显的解决方案收集所有线程,然后让一个线程对它们进行排序 - 如果没有原子操作,我无法安全地收集所有单独的线程(另一个线程可以重写插槽)。

最佳答案

在任何意义上都没有声称是最优的(显然有更快的方法可以使用原子比较和设置操作,或者如 Martin 所指出的,原子增量)...

假设所有线程都知道N,并且每个线程都有一个唯一的非零ID值,比如它在32位空间的栈地址...

在共享空间使用大小为N的数组;确保此数组初始化为零。

每个线程都拥有数组中第一个槽,该槽的 ID 小于或等于线程的 ID;线程在那里写它的ID。这一直持续到数组充满非零值,并且所有值都按降序排列。

算法完成时,线程槽在数组中的索引就是它的序号。

关于algorithm - 没有原子 CAS 的快速线程排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2745068/

相关文章:

language-agnostic - 您是否曾经限制自己只使用语言功能的子集?

java - 如何让我的 java 程序从我输入的值中打印出最小和最大的数字

java - ExecutorService如何改变调度时钟

Java Threads isInterrupted(),为什么没有出现这个输出

language-agnostic - 如果 WEB 在 2010 年推出,您会教什么?

unit-testing - 测试代码的理想时间范围是多少

jquery - 如何递归地组织元素(俄罗斯方 block 的碎片)

java - 如何从 {a1|a2|a3} 格式字符串中获取 N 个随机字符串?

为每个英文单词生成唯一序列号的算法

java - 线程不可理解的行为