相关疑难解决方法(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#bool是原子的,为什么volatile是有效的

C#中,我们知道a bool是原子的 - 那么为什么将它标记为有效volatile呢?有什么不同,什么是一个好的(甚至是实际的)用例?

bool _isPending;
Run Code Online (Sandbox Code Playgroud)

volatile bool _isPending; // Is this realistic, or insanity?
Run Code Online (Sandbox Code Playgroud)

我在这里这里做了一些阅读,我正在努力确保我完全理解两者的内部运作.我想知道什么时候使用一个与另一个相比,或者只是bool足够.

c# multithreading boolean atomic volatile

11
推荐指数
2
解决办法
1378
查看次数

如何在C#.Net 4.0中重启线程?

我在VS 2010中使用C#.Net4.0.如何重新启动Thread

它就像我想要Abort()的线程和Start()它从一开始?可能吗?

c# multithreading .net-4.0

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

在C#中赋值给volatile变量

我对C#的理解说(感谢Jeff Richter和Jon Skeet),任务是"原子的".什么不是当我们混合读写(递增/递减),因此我们需要使用Interlocked上的方法.如果只有Read&assign,那么这两个操作都是原子的吗?

public class Xyz
{
    private volatile int _lastValue;
    private IList<int> AvailableValues { get; set; }
    private object syncRoot = new object();
    private Random random = new Random();

    //Accessible by multiple threads
    public int GetNextValue() //and return last value once store is exhausted
    {
        //...

        var count = 0;
        var returnValue = 0;

        lock (syncRoot)
        {
            count = AvailableValues.Count;
        }

        if (count == 0)
        {
            //Read... without locking... potential multiple reads
            returnValue = _lastValue;
        }
        else
        {

            var …
Run Code Online (Sandbox Code Playgroud)

c# volatile

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

标签 统计

c# ×4

multithreading ×3

volatile ×2

.net-4.0 ×1

atomic ×1

boolean ×1