唯一整数多线程
Unique integer multiple threads
我正在尝试生成可从多个线程使用的唯一 integer
ID。
public partial class Form1 : Form
{
private static int sharedInteger;
...
private static int ModifySharedIntegerSingleTime()
{
int unique = Interlocked.Increment(ref sharedInteger);
return unique;
}
SimulateBackTestRow1()
{
while (true)
{
int num = ModifySharedIntegerSingleTime();
}
}
SimulateBackTestRow2()
{
while (true)
{
int num = ModifySharedIntegerSingleTime();
}
}
Task modifyTaskOne = Task.Run(() => SimulateBackTestRow1());
Task modifyTaskTwo = Task.Run(() => SimulateBackTestRow2());
但是,当采用以前未使用过的唯一编号的代码传递给 ModifySharedIntegerSingleTime
获取的编号时,我遇到了与非唯一编号的冲突。
以 thread-safe
方式获取唯一 int ID 的正确方法是什么?
您只有 2^32 个具有整数的唯一值。由于您在循环中尽可能快地生成值,因此生成超过 运行 所需的约 40 亿个值并开始返回您已经使用并导致的值不会花费您很长时间碰撞。要么你的程序中有一些错误导致你生成比实际需要更多的新值,要么你需要使用具有更多值的类型,例如 long 或 GUID。
我正在尝试生成可从多个线程使用的唯一 integer
ID。
public partial class Form1 : Form
{
private static int sharedInteger;
...
private static int ModifySharedIntegerSingleTime()
{
int unique = Interlocked.Increment(ref sharedInteger);
return unique;
}
SimulateBackTestRow1()
{
while (true)
{
int num = ModifySharedIntegerSingleTime();
}
}
SimulateBackTestRow2()
{
while (true)
{
int num = ModifySharedIntegerSingleTime();
}
}
Task modifyTaskOne = Task.Run(() => SimulateBackTestRow1());
Task modifyTaskTwo = Task.Run(() => SimulateBackTestRow2());
但是,当采用以前未使用过的唯一编号的代码传递给 ModifySharedIntegerSingleTime
获取的编号时,我遇到了与非唯一编号的冲突。
以 thread-safe
方式获取唯一 int ID 的正确方法是什么?
您只有 2^32 个具有整数的唯一值。由于您在循环中尽可能快地生成值,因此生成超过 运行 所需的约 40 亿个值并开始返回您已经使用并导致的值不会花费您很长时间碰撞。要么你的程序中有一些错误导致你生成比实际需要更多的新值,要么你需要使用具有更多值的类型,例如 long 或 GUID。