Поскольку IsInUpdate
- это просто открытое поле (и не volatile
в этом случае), есть нет гарантий относительно того, что вы видите; нормальные разумные правила относительно того, что вы видите, применяются только к одному потоку, и вы не защитили эти данные. Существует также крайний случай вокруг условия start , но лично я бы использовал либо lock
(если вам нужно дождаться его завершения), либо, возможно, Interlocked
, если вам просто нужно знать, если он активен.
Например:
class A
{
private readonly object syncLock = new object();
public object SyncLock { get { return syncLock; } }
public void Update()
{
lock(SyncLock)
{
//(...do stuff...)
}
}
}
и
void Update()
{
lock(a_inst.SyncLock)
{
(...do stuff...)
}
}
С учетом вышеизложенного вы гарантируете, что только один поток будет иметь блокировку в любое время, поэтому, если вы «сделаете что-то», вы узнаете , что он не запускает другое обновление ( ). Если вам нужно ждать и т. Д., Есть также методы Wait()
/ Pulse()
против блокировок, или вы можете использовать ворота, такие как ManualResetEvent
/ AutoResetEvent
.
Такие вещи, как lock
, также обеспечивают правильные барьеры памяти между потоками, поэтому вы видите правильные данные.