(Предполагается, что вы имеете в виду C #.)
Если вы имеете в виду Thread
буквально, то ваш ответ зависит от того, генерирует ли Thread.Join
неявно ли барьеры памяти (что, согласноответы, которые уже даны, вероятно, так и есть).
Однако, если вы имеете в виду, что Alpha
и Beta
- это пользовательские задачи, выполняемые в фоновом потоке (возможно, из пула потоков), и что «ожидание »относится к синхронизации на уровне пользователя между двумя задачами , тогда более вероятно, что данные будут не свежими, если только не введена сигнальная конструкция или явный барьер.
Вот тривиальный пример:
public class Program
{
static string A = "foo";
static volatile bool isAlphaReady = false;
static void Alpha()
{
A = "bar";
isAlphaReady = true;
}
static void Beta()
{
while (!isAlphaReady)
; // Wait by polling
Console.WriteLine(A);
}
static void Main(string[] args)
{
new Thread(Alpha).Start();
new Thread(Beta).Start();
Console.ReadKey();
}
}
Хотя (интуитивно) кажется, что Beta
всегда будет выводить "bar"
как значение A
, это не гарантируется на многопроцессорном компьютересистема со слабым поведением синхронизации (например, Itanium), в этом случае вместо нее может выводиться "foo"
.