[программистское]
Apr. 24th, 2008 03:42 pmгы, а слово volatile, оказывается, применимо только к членам. а если я передаю в другой тред кложу, которая меняет локальную переменную, то что я должен делать?
delegate void Callback();
class ThreadData { internal object Data; internal Callback OnExit; }
void FanOut(object[] datas)
{
int threadCount = datas.Length;
foreach (object data in datas)
{
ThreadData threadData = new ThreadData(data);
threadData.OnExit = delegate { Interlocked.Decrement(ref threadCount); };
ThreadPool.QueueUserWorkItem(ThreadProc, threadData);
}
}
(no subject)
Date: 2008-04-25 10:45 am (UTC)В результате вдумчивого чтения документации у меня создалось впечатление, что использование любой synchronization-related конструкции как бы говорит компилятору, что надо всё релоаднуть, а volatile нужен только когда этих конструкций нет.
Но в явном виде и с перечислением штук, считающихся относящимися к синхронизации, я не нашёл ничего. Сообщи, если тебе вдруг повезёт больше, пожалуйста.
(no subject)
Date: 2008-04-25 08:17 pm (UTC)my another point is that with closures local variables lose their "locality" and therefore there is no sense to make "volatile" only applicable to members.
(no subject)
Date: 2008-04-25 08:22 pm (UTC)Да, было бы неплохо, если б они добавили такую штуку.
Пока придётся руками повторять работу компилятора по превращению кложура в класс и ставить волатиль там, видимо.
(no subject)
Date: 2008-04-30 09:52 am (UTC)For more information, see the following sections in the C# Language Specification:
3.10 Execution order
10.5.3 Volatile fields
Оно, оказывается, вообще всё не так, как кажется! volatile не конкретную переменную заставляет релоадиться, а вообще всё -- при доступе к этой переменной. То есть, насколько я понимаю, тебе достаточно в любое место вставить lock(this) {} (именно так, пустой), это сгенерит critical execution point и всё заработает.
(no subject)
Date: 2008-05-01 07:55 am (UTC)(no subject)
Date: 2008-05-01 11:04 am (UTC)Yes, that's the best solution, thanks.