提问人:user22155685 提问时间:11/7/2023 最后编辑:Theodor Zouliasuser22155685 更新时间:11/7/2023 访问量:22
Interlocked.MemoryBarrierProcessWide() 如何更改多核中的执行顺序?
How does Interlocked.MemoryBarrierProcessWide() change the execution order in multicore?
问:
如果我们以发布模式运行以下代码
class Program
{
static volatile int x, y, a, b;
static void Main()
{
while (true)
{
var t1 = Task.Run(Test1);
var t2 = Task.Run(Test2);
Task.WaitAll(t1, t2);
if (a == 0 && b == 0)
{
Console.WriteLine("{0}, {1}", a, b);
}
x = y = a = b = 0;
}
}
static void Test1()
{
x = 1;
//Interlocked.MemoryBarrierProcessWide() comment out first
a = y;
}
static void Test2()
{
y = 1;
b = x;
}
}
我们可以看到很多 0,0 打印出来,因为我们不使用任何内存障碍。
但是,如果我们使用(取消注释),那么我们将看不到任何 0,0 输出。Interlocked.MemoryBarrierProcessWide()
但是,如果我将顺序更改为Test2
class Program
{
static volatile int x, y, a, b;
static void Main()
{
while (true)
{
var t1 = Task.Run(Test1);
var t2 = Task.Run(Test2);
Task.WaitAll(t1, t2);
if (a == 0 && b == 0)
{
Console.WriteLine("{0}, {1}", a, b);
}
x = y = a = b = 0;
}
}
static void Test1()
{
x = 1; // 2
Interlocked.MemoryBarrierProcessWide(); // 3
a = y; // 4
}
static void Test2()
{
b = x; // 1
y = 1; // 5
}
}
我标记了执行顺序,threadA 执行 1,所以是 0,然后发生上下文切换 threadB 执行 2,3,4,执行 4 后,是 0,然后 threadA 连续执行 5。所以我们应该打印 0,0,但没有,这是为什么?Interlocked.MemoryBarrierProcessWide() 如何更改执行顺序,以便没有 0,0 打印b
a
Test2
static void Test2()
{
y = 1;
b = x;
}
或
static void Test2()
{
b = x;
y = 1;
}
答: 暂无答案
评论