相关疑难解决方法(0)

为什么我们需要Thread.MemoryBarrier()?

在"C#4 in a Nutshell"中,作者表明这个类有时可以写0 MemoryBarrier但是我无法在我的Core2Duo中重现:

public class Foo
{
    int _answer;
    bool _complete;
    public void A()
    {
        _answer = 123;
        //Thread.MemoryBarrier();    // Barrier 1
        _complete = true;
        //Thread.MemoryBarrier();    // Barrier 2
    }
    public void B()
    {
        //Thread.MemoryBarrier();    // Barrier 3
        if (_complete)
        {
            //Thread.MemoryBarrier();       // Barrier 4
            Console.WriteLine(_answer);
        }
    }
}

private static void ThreadInverteOrdemComandos()
{
    Foo obj = new Foo();

    Task.Factory.StartNew(obj.A);
    Task.Factory.StartNew(obj.B);

    Thread.Sleep(10);
}
Run Code Online (Sandbox Code Playgroud)

这种需要对我来说似乎很疯狂.如何识别出现这种情况的所有可能情况?我认为如果处理器改变了操作顺序,它需要保证行为不会改变.

你还懒得使用障碍吗?

.net c# multithreading thread-safety memory-barriers

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

在锁定之前移动无关锁定语句之后的读取指令吗?

这个问题是这个帖子中评论的后续内容.

我们假设我们有以下代码:

// (1)
lock (padlock)
{
    // (2)
}
var value = nonVolatileField; // (3)
Run Code Online (Sandbox Code Playgroud)

此外,我们假设没有任何指令对其(2)有任何影响,nonVolatileField反之亦然.

读取指令是否(3)可以以锁定语句之前(1)或其内部结束的方式重新排序(2)

据我所知,C#规范(§3.10)和CLI规范(§I.12.6.5)中没有任何内容禁止此类重新排序.

请注意,这与问题不同.在这里,我特别询问阅读说明,因为据我所知,它们不被认为是副作用,并且有较弱的保证.

.net c# clr multithreading locking

6
推荐指数
1
解决办法
162
查看次数