] Понимание неблокирующей синхронизации потоков и Thread.MemoryBarrier [

] [

] В этой онлайн-книге о потоках: [] 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 - нет, до сих пор неясно. [

]

5
задан Valentin Kuzub 30 August 2011 в 22:33
поделиться