相关疑难解决方法(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万
查看次数

C/C++基本类型是原子的吗?

是C/C++的基本类型,如int,double等,原子,如线程?

他们是否免于数据竞赛; 也就是说,如果一个线程写入这种类型的对象而另一个线程从中读取,那么行为是否定义明确?

如果没有,它是否依赖于编译器或其他东西?

c c++ multithreading atomic

58
推荐指数
4
解决办法
7349
查看次数

我怎么知道这个C#方法是否是线程安全的?

我正在为ASP.NET缓存项目删除事件创建一个回调函数.

文档说我应该调用一个对象或调用我知道将存在的调用(将在范围内),例如静态方法,但它说我需要确保静态是线程安全的.

第1部分:我可以采取哪些措施使其非线程安全?

第2部分:这是否意味着,如果我有

static int addOne(int someNumber){
    int foo = someNumber;
    return foo +1; 
}
Run Code Online (Sandbox Code Playgroud)

我叫Class.addOne(5); 和Class.addOne(6); 同时,我可能会返回6或7,具体取决于谁首先调用foo?(即比赛条件)

c# concurrency static-methods

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

C#和bool的线程安全性

我对这个主题非常困惑 - 读取/切换bool值是否是线程安全的.

    // case one, nothing
    private bool v1;
    public bool V1 { get { return v1; } set { v1 = value; } }

    // case two, with Interlocked on set
    private int v2;
    public int V2 { get { return v2; } set { Interlocked.Exchange(ref v2, value); } }

    // case three, with lock on set
    private object fieldLock = new object();
    private bool v3;
    public bool V3 { get { return v3; } set { lock …
Run Code Online (Sandbox Code Playgroud)

c# multithreading thread-safety

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

C# 值类型赋值是原子的吗?

值类型的分配是否在 .Net 中被认为是原子的?

例如,考虑以下程序:

struct Vector3
{
    public float X { get; private set; }
    public float Y { get; private set; }
    public float Z { get; private set; }


    public Vector3(float x, float y, float z)
    {
        this.X = x;
        this.Y = y;
        this.Z = z;
    }

    public Vector3 Clone()
    {
        return new Vector3(X, Y, Z);
    }

    public override String ToString()
    {
        return "(" + X + "," + Y + "," + Z + ")";
    }
} …
Run Code Online (Sandbox Code Playgroud)

c# atomic value-type thread-safety tearing

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