我有一个跟踪10,000个并发任务完成的整数数组,其值为1或0.我认为如果这个数组是Bits数组并且每个并发线程使用了interlocked.CompareExchange会更有效率(或类似的)改变一个位。
如果Interlocked没有“bit”过载,我该如何处理?
答案 0 :(得分:2)
您可以在循环中使用Interlocked.CompareExchange(ref int, int, int)
伪造它,但我认为它不会更有效:
private static void SetBit(ref int valueToUpdate, int bitToSet)
{
while (true)
{
int oldValue = valueToUpdate;
int newValue = oldValue | bitToSet;
int result = Interlocked.CompareExchange(ref valueToUpdate, newValue, oldValue);
if (result == oldValue) break;
}
}
答案 1 :(得分:1)
我认为您不能使用Interlocked
来使用位。我相信你必须切换到ints
的数组,这样每个位都在它自己的int
内。
Interlocked.CompareExchange
只比较相等,而你只需要比较int
中你不能做的一个比特,除非你使用其他并发策略来保护int
的其他变化比特位于。
答案 2 :(得分:1)
您需要线程安全的构造来跟踪并发任务的完成情况。因此,互锁结构总是比锁更快(因为它们不需要锁),你应该使用Interlocked
- 类中的静态方法和整数(0代表{{1例如,false
为1。}。
答案 3 :(得分:1)
首先,不,所有互锁功能都在内存地址上工作,并且各个位不可寻址。
那么该做什么呢?
我会调查两个选项:
InterlockedIncrement
。要查看是否所有任务都已完成,只需检查该值是否已达到10,000。我不知道哪个是最快的。如果表现很重要,那就进行基准测试:)