1. ホーム
  2. c++

[解決済み] インターロックドインクリーメント使用

2022-02-09 13:44:53

質問事項

について読んでいると インターロックドインクリーメント 渡される変数は32ビット境界にアラインされていなければならないという記述を目にしました。通常、このようなInterlockedIncrementを使用するコードを見たことがあります。

class A
{
 public:
   A();
   void f();

 private:
  volatile long m_count;
};

A::A() : m_count(0)
{
}

void A::f()
{
  ::InterlockedIncrement(&m_count);
}

上記のコードはマルチプロセッサシステムで正しく動作しますか、それとももう少し気をつけるべきですか?

どのように解決するのですか?

コンパイラの設定に依存します。 しかし、デフォルトでは、8バイト以下は自然な境界でアラインされます。 したがって、int"は32ビット境界にアライメントされます。

また、"#pragma pack"指令を使用すると、コンパイル単位でアライメントを変更することができます。

なお、この回答はMicrosoft C/C++コンパイラを想定しています。 パッキングルールはコンパイラによって異なるかもしれません。 しかし、一般的には、私は 想定 Windows 用のほとんどの C/C++ コンパイラは、Microsoft SDK ヘッダでの作業を少し簡単にするために、同じパッキング・デフォルトを使用しているはずです。