多线程安全计数器

时间:2017-03-13 14:12:58

标签: c# multithreading thread-safety

我想做"计算"以下示例中的线程安全。

在此,"过程"在同一个班级控制的线程中不断运行但是"重置"是由另一个线程通过类的对象调用。

namespace sample
{
    class xyz
    {
        int count;

        reset()
        {
            count=0;
        }

        process()
        {
           ..
           ..
           ..
           count +=10
           ..
           ..
        }
    }
}

编辑1:这是一个可能的解决方案吗?

public class Xyz
{
    private int count;

    private static Object loackable = new Object();

    public void Reset()
    {
        lock(lockable)
        {
            count = 0;
        }

    }

    public void Process()
    {
       lock(loackable)
       {            
           count += 10;
       }
    }
}

2 个答案:

答案 0 :(得分:0)

对于基本计数器,您可以使用方法。 Interlocked上课。

对于任何更复杂的事情,使用相同的对象来锁定计数器上的每个操作,使用相同的对象来锁定单个计数器(只要它们在问题或实例对象中显示,只要它们与同一个计数器配对,则为一个静态)一直以来。

请注意

  • 你需要保护两者。如果您需要正确的值,请进行读写操作。
  • lock无法帮助您在一般情况下实现计数器,因为volatile不是原子操作,并且多个线程可以读取相同的值而不是递增它,因此对于两个线程递增计数器10,您可以计数器根据时间增加10或20。它可能适用于单个写入线程,给人的印象是代码是正确的。

答案 1 :(得分:-1)

您应该为'count'字段添加'volatile'关键字。这可确保'count'字段始终是线程安全的。 (Read this

public class Xyz
{
    private volatile int count;

    public void Reset()
    {
        count = 0;
    }

    public void Process()
    {
        count += 10;
    }
}

请关注C# goodline