c# - 多线程增加int

标签 c# multithreading int

当多个线程试图增加 int 时,我遇到了一个问题。这是我的代码:

private int _StoreIndex;
private readonly List<Store> _Stores = new List<Store>();

public void TestThreads()
{
    _StoreIndex = 0;

    for (int i = 0; i < 20; i++)
    {
        Thread thread = new Thread(() =>
            {
                while (_StoreIndex < _Stores.Count - 1)
                {
                    _Stores[Interlocked.Increment(ref _StoreIndex)].CollectData();
                }
            });
        thread.Start();
    }
}

我希望每次线程执行此代码时 int 都会增加 1。然而,事实并非如此。我也尝试过使用 lock (new object()),但这也不起作用。问题是并非所有商店都收集数据,因为(调试时),_StoreIndex 就像 0、1、1、3、4、5 一样。列表中的第二个对象显然被跳过了。

我做错了什么?提前致谢。

最佳答案

在您的情况下,我首先会使用 TPL 来避免手动创建线程和索引的所有这些问题:

Parallel.ForEach(_Stores, (store) => store.CollectData());

关于c# - 多线程增加int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8332141/

相关文章:

c# - 使用 Linq 和 C# 计算一行中有多少个单元格为空

python - 限制并行工作的线程数

linux - 所有类型的进程间/线程间通信都需要系统调用吗?

java - 如何将整数转换为二进制表示形式,并根据需要附加一定数量的位

PHP:非常简单的编码/解码字符串

c# - 多个引用类型字段上的 LINQ GroupBy;自定义相等比较器

C#(dotnet 核心)关联失败。 GKE 上的入口 (GLBC) 负载均衡器背后

java - 理论上是否可以使用静态分析工具证明Java代码不存在竞争条件?

java - java中如何将int转换为uint8

c# - 用于简单实时圆检测的霍夫变换替代方案