Rob*_*ean 12 .net multithreading locking monitor memory-barriers
在.NET中的lock关键字是语法糖各地Monitor.Enter及Monitor.Exit,所以你可以说,这段代码
lock(locker)
{
// Do something
}
Run Code Online (Sandbox Code Playgroud)
是相同的
Monitor.Enter(locker);
try
{
// Do Something
}
finally
{
Monitor.Exit(locker);
}
Run Code Online (Sandbox Code Playgroud)
但是,.NET框架还包括MemoryBarrier以类似方式工作的类
Thread.MemoryBarrier();
//Do something
Thread.MemoryBarrier();
Run Code Online (Sandbox Code Playgroud)
我很困惑,当我想用Thread.MemoryBarrier在lock/ Monitor版本?我更加困惑的是线程教程,它表明它们的功能相同.
据我所知,可见的区别是不需要锁定对象,我想使用Monitor你可以跨线程做一些事情MemoryBarrier在一个线程上.
我的直觉告诉我,另一个关键的区别是MemoryBarrier仅变量而不是方法.
最后这与现有问题无关何时在线程安全锁定代码中使用'volatile'或'Thread.MemoryBarrier()'?(C#),因为它专注于volatile我理解其使用的关键字.
Jon*_*eet 22
在我看来,你几乎不应该使用Thread.MemoryBarrier.这用于无锁代码 - 确保在一个线程上进行的更改对另一个线程可见,而不会产生锁定成本.它并没有控制线程同步,不像lock.我没有看到他在Joe教程中说MemoryBarrier"功能相同"的地方lock.你能解释一下你到底得到的印象吗?
在我看来,除了主要熟练程度为并发性的开发人员之外,几乎所有人都认为低级无锁代码太难了.如果我想编写一些无锁代码,我将使用由这些开发人员构建的更高级别的构建块(例如.NET 4.0中的Parallel Extensions),而不是尝试自己编写.
只是作为一个例子,最近我有我的眼睛睁开的确切含义volatile,其并不 "总是从主内存中读取,总是直接写主内存".(我自己的线程教程目前仍然有解释 - 我需要在某些时候解决这个问题.)它比那更微妙.这意味着我以前的一些用途volatile可能不正确.
| 归档时间: |
|
| 查看次数: |
4214 次 |
| 最近记录: |