相关疑难解决方法(0)

在C#中访问变量是一个原子操作吗?

我已经被认为如果多个线程可以访问变量,那么所有对该变量的读取和写入都必须受到同步代码的保护,例如"lock"语句,因为处理器可能会在中途切换到另一个线程写.

但是,我正在使用Reflector查看System.Web.Security.Membership并找到如下代码:

public static class Membership
{
    private static bool s_Initialized = false;
    private static object s_lock = new object();
    private static MembershipProvider s_Provider;

    public static MembershipProvider Provider
    {
        get
        {
            Initialize();
            return s_Provider;
        }
    }

    private static void Initialize()
    {
        if (s_Initialized)
            return;

        lock(s_lock)
        {
            if (s_Initialized)
                return;

            // Perform initialization...
            s_Initialized = true;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么s_Initialized字段在锁外读取?另一个线程难道不能同时写入它吗?变量的读写是否是原子的?

c# multithreading

63
推荐指数
4
解决办法
2万
查看次数

++运算符线程安全吗?

注意:我真的不是很擅长多线程编程,但我目前的项目让我这样做,所以我试图了解线程安全和什么不是.

我正在阅读Eric Lippert 关于++我所做的那些令人敬畏的答案之一.他说这才是真正发生的事情:

  1. 评估x以生成变量
  2. 将变量的值复制到临时位置
  3. 临时值递增以产生新值(不覆盖临时值!)
  4. 新值存储在变量中
  5. 操作的结果是新值

这让我思考,如果调用++ i的两个线程怎么办?如果第一个线程在步骤3,当第二个线程在步骤2时.(这意味着如果第二个线程在第一个线程将新值存储在变量中之前将值复制到临时位置,该怎么办?)

如果发生这种情况,那么两个线程似乎只会增加i一次而不是两次.(除非整件事情都在lock.)

c# multithreading

56
推荐指数
3
解决办法
2万
查看次数

C#中哪些操作是原子的?

是否有系统的方法来了解C#中的操作是否是原子操作?或者是否有任何一般指导方针或经验法则?

.net c# multithreading atomic

51
推荐指数
3
解决办法
3万
查看次数

标签 统计

c# ×3

multithreading ×3

.net ×1

atomic ×1