1

現在、次のようにブーストロックガードを使用していますが、中括弧の使用に関してまだ少し混乱しています.これら2つが同じかどうか知りたいと思いました.

void ThreadSafeMethod()
{
   {//Begin Lock
      boost::lock_guard<boost::mutex> lock(mutex_lock_symbol);
      ....
      ....
   }//End Lock
}

または、中括弧の1つのレイヤーを1つ削除するこの方法。これは正しく、上記と同じですか?

void ThreadSafeMethod()
{//Locks automatically 
      boost::lock_guard<boost::mutex> lock(mutex_lock_symbol);
}//Unlocks
4

2 に答える 2

2

The boost::lock_guard structure implements the RAII idiom (Resource Allocation is Intialization), and thus automatically locks upon construction and unlocks on destruction. When this happens depends on the usual C++ rules, i.e. when the structure leaves the scope that the boost::lock_guard was created in.

For instance:

void TestFunction( void ) {
     // Do non-blocking operations:

     {
          // Lock the Mutex:
          boost::lock_guard<boost::mutex> lockGuard( mutex_lock_symbol );

          // Do blocking operations
     } // Exit scope the boost::lock_guard was created in and therefore destroy it (thus unlock the mutex)

     // Do more non-blocking operations:
}

This just helps you control the number of operations for which the mutex is locked for by creating a new scope in which the boost::lock_guard is created. The other advantage of boost::lock_guard is that it is exception safe.

In the two examples you have given, because there is no other code outside of the scope in the first example the functionality of the two examples is the same.

于 2013-06-13T17:16:56.310 に答える
1

はい、内側の中括弧の後にコードを追加しない限り、それらは同じです。

基本的に、中括弧は lock_guard が存在するスコープを制限し、ロックを解除するときを制限します。内側のブレースがないと、関数が終了するとロックが解除されます。内側のブロックを離れると、それらと一緒に。ただし、あなたの例では、ブロックを離れてから関数を離れるまでの間に何も起こらないため、それらは同じことです。

于 2013-06-13T17:09:07.090 に答える