我正在开发一个有一堆线程处理数据的程序。
每个线程都需要获取下一个可用 ID,为下一个线程将该 ID 加 1,并以线程安全的方式执行此操作。
这是我会使用互斥锁的实例吗?我应该改用 Queue.Synchronized 并用所有 300,000 个 ID 填充它还是这是不必要的?
我是否应该只有一个整数并以某种方式锁定该数字的检索和更新,以便 thread1 进入,获取“20”作为下一个 ID,然后在另一个线程等待时将其增加到“21”?
这个用例的最佳实践是什么?
我正在开发一个有一堆线程处理数据的程序。
每个线程都需要获取下一个可用 ID,为下一个线程将该 ID 加 1,并以线程安全的方式执行此操作。
这是我会使用互斥锁的实例吗?我应该改用 Queue.Synchronized 并用所有 300,000 个 ID 填充它还是这是不必要的?
我是否应该只有一个整数并以某种方式锁定该数字的检索和更新,以便 thread1 进入,获取“20”作为下一个 ID,然后在另一个线程等待时将其增加到“21”?
这个用例的最佳实践是什么?
您可以在不通过Interlocked.Increment锁定的情况下执行此操作。
这样做:
private static int value;
public static int Value
{
get { return Interlocked.Increment(ref value); }
}
这将始终返回一个递增的整数,没有锁,并且具有完美的线程安全性。
这可能是Interlocked.Increment的完美候选。
int id = 0;
int nextId = Interlocked.Increment(ref id); // returns the incremented value
它Increment
作为原子操作执行并且是线程安全的。
没有。
最好的方法是 Interlocked.Increment()。
基本上,您可以基于 CPU 体系结构提供的保证以线程安全的方式执行增量,而无需锁定。
您应该查看Interlocked 类。它提供了以原子方式递增整数值的功能。