0

関数とマルチスレッドについて友人と話していました。サンプルコードは次のとおりです。

void SomeClass::Foo()
{
   std::lock_guard<std::mutex> lock(mMutexObj);

   statement1;
   statement2;
   statement3;
}

そのため、コンパイラが必要な場所に関数をインライン化することがあります。そのような場合は可能ですか: コンパイラは関数をインライン化し、スコープがここで終了せず、デストラクタが呼び出されないためFoo、3 つのステートメントはすべて実行され、機能しません:lock_guard

// Inlined operations
std::lock_guard<std::mutex> lock(mMutexObj);

statement1;
statement2;
statement3;

// Global scope, where function was inlined continues here...
global statement1;
global statement2;
...;

出来ますか?そのコンパイラがそのような関数をインライン化する割合は何パーセントですか、またはインライン化された関数の範囲を正しく理解していない可能性がありますか?

4

3 に答える 3

9

関数がインライン化されているかどうか、またはインラインで宣言されているかどうかにかかわらず、プログラムの観察可能な動作は変わりません。いずれの場合も、lock_guard のデストラクタは適切な場所で呼び出されます。同様に、関数内の静的変数は、inline(d) であるかどうかにかかわらず、同じ変数を参照します。

于 2013-08-06T21:34:37.760 に答える
4

#defineあなたが説明した効果は、s/macrosを使用する場合に発生しますが、 inline. 実際、インライン化が導入された理由の 1 つは、#define.

{と を使用するのと同等の方法を使用して、スコープが保持されていると思います}

// Inlined operations
{  //curly braces create a scope
  std::lock_guard<std::mutex> lock(mMutexObj);

  statement1;
  statement2;
  statement3;
}

// Global scope
global statement1;
global statement2;
...;

上記の中括弧の使用に注意してください。これは完全に有効なコードであり、単一の関数内の複数のポイントでミューテックスをロック/ロック解除する必要がある場合に使用する傾向があります。コンパイラはインライン関数でも同様のことをしていると思います。

于 2013-08-06T21:45:21.220 に答える