Требуется ли для чтения / записи в регистре защита критического раздела?

У меня есть проект 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 должна быть ненужной. Я прав?

2

Решение

Ты можешь использовать InterlockedExchange установить значение и InterlockedExchangeAdd [документация] с нулем в качестве добавления, чтобы прочитать значение. Эти функции гарантируют синхронизированный доступ и доступны начиная с WM 5.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]