我有3个多线程进程。 我想实现一个序列号生成器(每次调用它都会按顺序返回下一个数字)。 所有三个进程或其线程都可以请求生成下一个序列号。 我正在寻找一种非常低延迟的解决方案。
提前感谢您的想法。
很抱歉错过了这个。我的平台是: - - Linux平台 - C ++
答案 0 :(得分:1)
由于您没有提供太多细节,只是一般性的想法:
你写道有3个进程运行多个线程...我假设它们运行在同一台机器上...另一个假设:你正在使用某些当前版本的Windows ...
实施共享内存(通过MemoryMappedFile
或其native counterpart)并使用每个进程中的原子增量(InterlockedAdd64
或其托管对方Interlocked.Add
)来获取下一个数字...
编辑 - 在OP添加平台(Linux)之后:
您也可以使用与Linux上述相同的方法:
mmap
API使用标记MAP_SHARED
libatomic
查看http://packages.debian.org/source/sid/libatomic-ops 答案 1 :(得分:0)
共享内存区域存储序列中的最后一个数字。每个进程,当它需要序列中的新数字时,计算它,InterlockedCompareExchange()使用旧数字。如果ICE()成功,则使用该数字,如果不成功,则重复该例程,直到ICE()成功为止。
答案 2 :(得分:0)
如果你在JVM世界中寻找一个:
class Sequencer {
private AtomicLong sequenceNumber = new AtomicLong(0);
public long next() { return sequenceNumber.getAndIncrement(); }
}