] [
] В этой онлайн-книге о потоках: [] http://www.albahari.com/threading/part4.aspx [][
] [
] приведен пример [] Thread.MemoryBarrier () [
][
] [
class Foo
{
int _answer;
bool _complete;
void A()
{
_answer = 123;
Thread.MemoryBarrier(); // Barrier 1
_complete = true;
Thread.MemoryBarrier(); // Barrier 2
}
void B()
{
Thread.MemoryBarrier(); // Barrier 3
if (_complete)
{
Thread.MemoryBarrier(); // Barrier 4
Console.WriteLine (_answer);
}
}
}
] [
] Мы обсуждали, происходит ли какая-либо блокировка потоков или нет? [
] [
] Я думаю, что есть, особенно с учетом того, что [
] [
] [] Полный забор занимает около десяти наносекунд на настольных компьютерах эпохи 2010 года. [
] [
] [
] С другой стороны, предполагается, что полный забор только [] запрещает переупорядочивание инструкций и кеширование [
], что по звуку не квалифицируется как блокировка потока (в отличие от [] блокировки [
], где этот поток очищается ожидает, пока другой снимет блокировку, прежде чем продолжить, и блокируется в течение этого времени) [
] [
] О «состоянии блокировки» этого потока. Я говорю не о том, помещен ли поток в состояние [] заблокирован [] или нет, а о том, происходит ли какая-то синхронизация потоков, что означает, что один поток не может работать, а другой не позволяет ему это сделать, в данном случае с помощью MemoryBarrier. [
] [
] Также я хотел бы получить четкое представление о том, чего достигает каждый барьер. Например, Barrier 2 - как именно он обеспечивает гарантию свежести и как связан с барьером 3? Если бы кто-нибудь подробно объяснил, какова цель каждого барьера (что могло бы пойти не так, если бы там не было 1, 2, 3 или 4), я думаю, что id значительно улучшит мое понимание этого. [
] [
][] EDIT: [] в основном это Теперь ясно, что делают 1, 2 и 3. Однако что делает 4, а 3 - нет, до сих пор неясно. [
]