c# - 可以使用 Interlocked.CompareExchange with a Bit 吗?

标签 c# arrays multithreading task-parallel-library interlocked

我有一个整数数组,用于跟踪 10,000 个并发任务的完成情况,其中值为 1 或 0。我认为如果这个数组是一个位数组并且每个并发线程都使用 interlocked 会更有效率。CompareExchange (或类似的)改变一个位。

如果 Interlocked 没有“位”的重载,我应该如何处理这个问题?

最佳答案

您可以在循环中使用 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;
   }
}

关于c# - 可以使用 Interlocked.CompareExchange with a Bit 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13586075/

相关文章:

javascript - 如何使用对象属性从数组中删除对象 - React

c - 使用没有最后一个元素的字符串连接在 c 中打印数组

java - 如何修改 String[] 内的元素,该元素位于另一个 Arraylist 内的 Arraylist 内

ruby - 如何从 ruby​​ 线程获取错误消息

c# - '' 没有重载匹配委托(delegate) 'System.Threading.ParameterizedThreadStart'

在 32 位中运行时在 System32 中找不到 C# 文件

c++ - Boost.Thread 还是::thread?

python - 在python中,调用后是否有可能发生异常,但其后的try block 为 "before"?

c# - 中缀到后缀转换器

C#的编译器设计——前向引用