gpt4 book ai didi

c# - 试图了解Thread.MemoryBarrier()与上下文切换之间的关系

转载 作者:行者123 更新时间:2023-12-03 12:49:53 26 4
gpt4 key购买 nike

由于似乎上下文切换可能发生在指令执行的任何时刻,所以我现在想知道为什么代码“部分有问题”(那两条指令)有意义,如果上下文切换可以在任何指令之间发生并且我们可能在不同的CPU上第二条指令的核心。

void B()
{
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
//PART IN QUESTION
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine (_answer);
//END PART IN QUESTION
}
}

这里对MemoryBarrier的描述似乎不能保证 MemoryBarrier调用后不会切换CPU。

(这与此 question有关)

最佳答案

What guarantees that context-switch will not happen after Thread.MemorryBarrier() call?



没有。 MemoryBarriers不会阻止上下文切换(或代码的原子执行)。

至于您的其他问题,为什么需要屏障4:

在上一个问题的示例代码中,如果没有障碍4,C#编译器,CLR或CPU可能会在完成变量之前重新排列答案变量的读取顺序。即实际运行的代码可能类似于:
Thread.MemoryBarrier();    // Barrier 3
int tmpanswer = _answer;
if (_complete)
{

Console.WriteLine (tmpanswer);
}

Console.WriteLine()之前的屏障将阻止在读取 _answer之前读取 _completed
但是请记住,代码示例仅对void B()中的代码提供了这一保证(假设A()仅运行一次)
  • 如果_complete变量为true,则Console.WriteLine将写出123而不是0。

  • 因此,除非A和B串行运行,否则代码不会提供任何锁定/通知,因此B始终将打印123。A()和B()可能在执行时随时被交错/中断-您无法控制谁什么时候去运行。

    无论您以哪个顺序启动2个线程,都无法保证B()在A()之后运行。(尽管在代码中的其他位置,您可以先启动A()并显式等待其完成,然后再启动B () 当然)

    关于c# - 试图了解Thread.MemoryBarrier()与上下文切换之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7260758/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com