Memory Model
От: Ушастый Ёж Великобритания  
Дата: 27.08.09 22:55
Оценка:
Товарищи, подскажите пожалуйста, является ли следующий код thread-safe:

class A
{
  private int _something;

  public void Foo()
  {
    _something = 1;
    Thread thread = new Thread(Bar);
    thread.Start();
    thread.Join();
    Assert(_something == 2);
  }

  private void Bar()
  {
    Assert(_something == 1);
    _something = 2;
  }
}


Другими словами, происходит ли синхронизация памяти перед стартом нового потока, и после его завершения, а так же может ли компилятор поменять местами Thread.Start/Thread.Join с другими действиями.

В джава 1.5 такие гарантии имеют место быть (т.е. все будет работать как надо), пол-дня гуглил и читал мсдн — ни слова не нашел про то, как оно работает в C#. Может кто-нибудь дать ссылку, где про это написано?

Если это важно, речь идет о .NET 2.0
Re: Memory Model
От: Sinix  
Дата: 28.08.09 00:26
Оценка:
Здравствуйте, Ушастый Ёж

УЁ>Товарищи, подскажите пожалуйста, является ли следующий код thread-safe:


Да, будет, если код будет именно таким (ровно 2 потока и т.п.).
Как вариант — используйте Thread.Interlocked... методы. Или можно сделать private volatile int _something . Или используйте lock/Monitor. Или вызывайте MemoryBarrier() явно.

На самом деле Interlocked достаточно. А вместо Join лучше использовать Begin/EndInvoke или WaitHandle.

УЁ>В джава 1.5 такие гарантии имеют место быть (т.е. все будет работать как надо), пол-дня гуглил и читал мсдн — ни слова не нашел про то, как оно работает в C#. Может кто-нибудь дать ссылку, где про это написано?


Слегка расписано в рихтере. Ещё —
http://rsdn.ru/article/dotnet/CSThreading1.xml
Автор(ы): Joseph Albahari
Дата: 24.03.2007
Подробно рассматривается работа с потоками — запуск, завершение, прерывание, блокировки, синхронизация, контексты синхронизации, особенности взаимодействия с апартаментами, а также потоковые возможности .NET — потоковые таймеры, пулы потоков, BackgroundWorker, асинхронные методы и делегаты.
В статье использован материал из книги Joseph Albahari, Ben Albahari "C# 3.0 in a Nutshell" — http://www.oreilly.com/catalog/9780596527570/

http://www.albahari.com/threading/
http://blogs.msdn.com/brada/archive/2004/05/12/volatile-and-memorybarrier.aspx и ссылки оттуда
(например http://msdn.microsoft.com/en-us/magazine/cc163715.aspx)
Re: Memory Model
От: AMogil Россия  
Дата: 28.08.09 07:59
Оценка:
Сделайте так:
private volatile int _something;


Можно через Interlocked, но в данном случае это лишнее.
Re: Memory Model
От: Ушастый Ёж Великобритания  
Дата: 28.08.09 13:00
Оценка:
Здравствуйте, Ушастый Ёж, Вы писали:

Спасибо что напомнили про volatile и прочее (я в курсе про них), но вопрос был именно в том, происходит ли слив данных в основную память из "запускающего" потока перед запуском "нового" потока, и из "нового" потока после возвращения из Thread.Join
Re: Memory Model
От: hexamino http://hexamino.blogspot.com/
Дата: 29.08.09 08:55
Оценка:
Здравствуйте, Ушастый Ёж, Вы писали:

УЁ>В джава 1.5 такие гарантии имеют место быть (т.е. все будет работать как надо), пол-дня гуглил и читал мсдн — ни слова не нашел про то, как оно работает в C#. Может кто-нибудь дать ссылку, где про это написано?


Смотри спецификацию C#, 3.10 Execution order, там упомянуто про thread creation.
Re[2]: Memory Model
От: Ушастый Ёж Великобритания  
Дата: 01.09.09 20:40
Оценка:
Здравствуйте, hexamino, Вы писали:

H>Смотри спецификацию C#, 3.10 Execution order, там упомянуто про thread creation.


О, спасибо! Правда какое то совсем скудное упоминание о довольно важной вещи. Удивительно то, что задав этот вопрос коллегам (которые типа C# девелоперы), никто не смог внятно ответить.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.