相关疑难解决方法(0)

易失性与联锁对抗锁定

假设一个类有一个public int counter由多个线程访问的字段.这int只是递增或递减.

要增加此字段,应使用哪种方法,为什么?

  • lock(this.locker) this.counter++;,
  • Interlocked.Increment(ref this.counter);,
  • 将访问修饰符更改counterpublic volatile.

现在,我发现volatile,我已经删除了许多lock语句和使用Interlocked.但是有理由不这样做吗?

c# multithreading locking volatile interlocked

647
推荐指数
8
解决办法
13万
查看次数

如何使 T 类型的字段可变?

我试图将一堆重复代码合并到一个具有以下结构的实用程序类中:

public class Shared<T>
{
    private volatile T _value;

    public object Lock { get; private set; }

    public T Value
    {
        get { lock (Lock) return _value; }
        set { lock (Lock) _value = value; }
    }

    public Shared(T startingValue)
    {
        _value = startingValue;
        Lock = new object();
    }

    public Shared()
        : this(default(T))
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,C# 不会让我。文档指出T必须是引用类型或原语之一(int、bool 等)。我唯一关心的类型是引用类型和 bool。显然,我不能使用无界类型T。有没有办法让我完成这项工作?甚至可以为此添加约束以使其作为Shared<bool>? 我什至不允许将其他结构类型标记为 volatile。:(

如果没有可能的方法将其标记为 volatile,当多个线程试图读取此值时,我是否还有其他保证不会对其进行优化?

c# generics

3
推荐指数
1
解决办法
975
查看次数

标签 统计

c# ×2

generics ×1

interlocked ×1

locking ×1

multithreading ×1

volatile ×1