0

我正在开发一个有一堆线程处理数据的程序。

每个线程都需要获取下一个可用 ID,为下一个线程将该 ID 加 1,并以线程安全的方式执行此操作。

这是我会使用互斥锁的实例吗?我应该改用 Queue.Synchronized 并用所有 300,000 个 ID 填充它还是这是不必要的?

我是否应该只有一个整数并以某种方式锁定该数字的检索和更新,以便 thread1 进入,获取“20”作为下一个 ID,然后在另一个线程等待时将其增加到“21”?

这个用例的最佳实践是什么?

4

4 回答 4

4

您可以在不通过Interlocked.Increment锁定的情况下执行此操作。

这样做:

private static int value;
public static int Value
{
    get { return Interlocked.Increment(ref value); }
}

这将始终返回一个递增的整数,没有锁,并且具有完美的线程安全性。

于 2009-09-10T01:37:40.583 回答
2

这可能是Interlocked.Increment的完美候选。

int id = 0;

int nextId = Interlocked.Increment(ref id); // returns the incremented value

Increment作为原子操作执行并且是线程安全的。

于 2009-09-10T01:36:50.127 回答
1

没有。

最好的方法是 Interlocked.Increment()。

基本上,您可以基于 CPU 体系结构提供的保证以线程安全的方式执行增量,而无需锁定。

于 2009-09-10T01:36:44.953 回答
1

您应该查看Interlocked 类。它提供了以原子方式递增整数值的功能。

于 2009-09-10T01:38:03.517 回答