У меня есть проект Visual Studio 2008 C ++ для Windows Mobile 6 ARMV4I, где у меня есть такой код:
// list of CPU registers (all DWORD aligned)
typedef volatile struct
{
// status register
DWORD my_status;
} MY_REGS;
MY_REGS* my_regs;
// reads the status register
DWORD ReadMyStatus()
{
DWORD status;
// EnterCriticalSection()
// equivalent to:
// status = INREG32( &my_regs->my_status );
status = ( *( volatile unsigned long* const )( &my_regs->my_status ) );
// LeaveCriticalSection()
return status;
}
// sets a bit in the status register
DWORD SetMyStatus( DWORD status )
{
// EnterCriticalSection()
// equivalent to:
// SETREG32( &my_regs->my_status, status );
( *( volatile unsigned long* const )( &my_regs->my_status ) ) =
( ( *( volatile unsigned long* const )( &my_regs->my_status ) ) | ( status ) );
// LeaveCriticalSection
}
Нужна ли защита CriticalSection для операций чтения и записи в регистре, если они могут быть вызваны одновременно из разных потоков?
Насколько я понимаю на WM ARMV4I, чтение / запись DWORD-выравниваемых DWORD являются атомарными и нестабильными, гарантируя, что память получает / освобождает семантику в WM. Таким образом, защита CS должна быть ненужной. Я прав?
Ты можешь использовать InterlockedExchange
установить значение и InterlockedExchangeAdd
[документация] с нулем в качестве добавления, чтобы прочитать значение. Эти функции гарантируют синхронизированный доступ и доступны начиная с WM 5.
Других решений пока нет …