7

WinAPIのInterlockedExchangeを使用して、スレッドのロックフリー同期を使用したいと思います。
現在、このようなクラスがあります。

struct DataExchange
{
    volatile LONG m_value;
    void SetValue(LONG newVal)
    {
        InterlockedExchange(&m_value, newVal);
    }

    LONG GetValue()
    {
        LONG workVal=0;
        InterlockedExchange(&workVal, m_value);
        return workVal;
    }
};

1つのスレッドは新しい値を設定でき、もう1つのスレッドはこの値を読み取ることができます。
今私がしたいのは、LONG値をに変更することstructです。structWinAPIにロックを解放する方法はありますか?

4

4 に答える 4

3

構造体を32ビットに収めることができない限り、ありません。その場合、InterlockedExchangeを引き続き使用できます。

于 2011-05-24T11:43:23.690 に答える
2

64ビットプラットフォームおよびWindowsVista/ 7でInterlockedExchange64を使用して、64ビット値でアトミック操作を取得できます。これは、構造体に2つの32ビットint値を収めるのに十分です。

この関数はコンパイラーの本能で実装されているため、基本的CMPXCHGにはx86のようにプラットフォームに依存するアセンブリ命令を呼び出します。この命令は、64ビットレジスタのソースオペランド、64ビットレジスタまたはメモリデスティネーションオペランド、およびRAXレジスタで最大(64ビットプラットフォームの場合)でのみ機能するため、実行できる特定のサイズの値のみがあります。重要なセクションを作成するために、ある種のロックやセマフォを組み込むことなく、単一のアセンブリ命令を使用する不可分操作。

于 2011-05-24T12:20:45.177 に答える
1

あなたができる最善のことはInitializeCriticalSectionAndSpinCount、十分に速く所有権を取得することが可能である場合、ロックを待たない機能を使用することです。

于 2011-05-24T11:52:15.113 に答える
1

構造体が正確に32ビットの場合のみ。

別の方法は、構造体へのポインターでInterlockedExchangeを使用することです。構造体は不変である必要があります(または変更しないでください)。構造体を更新するには、新しい構造体を作成してから、ポインターを交換します。構造体を破棄して、誰も使用していない場合にのみ、構造体が1回だけ実行されるように注意する必要があります。

于 2011-05-24T11:45:06.687 に答える