Вообще говоря, я не советую использовать продвинутые механизмы синхронизации, потому что их общеизвестно сложно понять правильно, но в этом случае вызов Thread.MemoryBarrier
может быть приемлемым.Конечно, это предполагает отсутствие требований атомарности, и совместно используемый объект никогда не может быть в полусгоревшем состоянии.На самом деле это может быть проще, чем разбрызгивать все с помощью volatile
.
object shared;
void WorkerThread()
{
MakeChangesToSharedObject(shared);
Thread.MemoryBarrier(); // commit the changes to main memory
}
void UIThread()
{
Thread.MemoryBarrier(); // ensure updates are read from main memory
UseSharedObject(shared);
}
Возможно, разработка кода таким образом, чтобы общий объект был неизменным, была бы лучше.Затем все, что вам нужно сделать, это заменить ссылку на общий объект в одну простую и быструю атомарную операцию.
volatile object shared;
void WorkerThread()
{
// The following operation is safe because the variable is volatile.
shared = GetNewSharedObject();
}
void UIThread()
{
// The following operation is safe because the variable is volatile.
object value = shared.SomeProperty;
}