2

Windows Mobile6ARMV4I用のVisualStudio2008 C ++プロジェクトがあり、次のようなコードがあります。

// 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
}

異なるスレッドから同時に呼び出すことができると仮定して、レジスタの読み取りと書き込みの周りにクリティカルセクション保護が必要ですか?

WM ARMV4Iで理解しているように、DWORDに合わせたDWORDの読み取り/書き込みはアトミックであり、揮発性であるため、WMでのメモリの取得/解放のセマンティクスが保証されます。したがって、CS保護は不要です。私は正しいですか?

4

1 に答える 1

1

InterlockedExchange値を設定するために使用でき、値を読み取るための加数としてゼロを使用してInterlockedExchangeAdd [documentation]を使用できます。これらの機能は同期アクセスを保証し、WM 5 以降で利用可能です。

于 2013-06-03T11:31:38.600 に答える