Если поток A порождает другой поток B с единственной целью записи в переменную V, а затем ждет его завершения, требуются ли барьеры памяти, чтобы гарантировать, что последующие чтения V в потоке A будут свежими? Я не уверен, есть ли какие-либо неявные барьеры в операциях завершения/присоединения, которые делают их избыточными.
Вот пример:
public static T ExecuteWithCustomStackSize<T>
(Func<T> func, int stackSize)
{
T result = default(T);
var thread = new Thread(
() =>
{
result = func();
Thread.MemoryBarrier(); // Required?
}
, stackSize);
thread.Start();
thread.Join();
Thread.MemoryBarrier(); // Required?
return result;
}
Требуются ли какие-либо/оба (или более) барьера в приведенном выше фрагменте?