2012-04-16 6 views
3

Boost 1.46.1のロック問題を解決しようとしています。私はいくつか試しましたが、私は満足できません。したがって、クリーンカットからの入力を聞きたいです。try_lockによるBoost Locking

スレッドA:

  • は常に手動ロック解除(またはスコープ)
  • 更新し、いくつかの重要なデータ
  • 重要なデータセクションの

スレッドBがロックを待機して取得する必要があります - ブロックしないでください(try_lock?) - ロックが取得された場合、上記のクリティカルセクションからデータを読み込みます。

私はshared_lockが必要かどうかわかりません。そうでなければこれを解決できますか? スレッドA:

{ 
// Critical section 
boost::mutex::scoped_lock lock(_mutex) ; 
} 

スレッドB:

EDIT、私のコードは次のようになります

boost::mutex::scoped_lock lock(_mutex, boost::try_to_lock); 
if(lock) { 

} 

しかし、私は失敗したtry_lockを記録することができていない - それならば、私は疑問に思います本当にうまくいく。

よろしく、 ポール

+0

あなたはブロックを回避するために使用できる型機能を「試す」などのすべてのロックを取得します。 –

+0

'try_lock'を使用する際に何が問題になりますか? – interjay

答えて

5

私にはそれはロックがFIFOでないスコープを除き、それは、働いているように思える、すなわち、ロックを要求する最初のスレッドは、ロックを取得する最初のスレッドではありません。私はテストのために次のコードを使用:

#include <boost/thread.hpp> 
#include <cstdio> 

boost::mutex mutex; 

void threadA() 
{ 
    for (int i = 10; i > 0;) 
    { 
     boost::mutex::scoped_lock lock(mutex); 
     { 
      fprintf(stderr, "Locked by A\n"); 
      usleep(100000); 
      fprintf(stderr, "Unlocked by A\n"); 
      i--; 
     } 
    } 
} 

void threadB() 
{ 
    for (int i = 10; i > 0;) 
    { 
     boost::mutex::scoped_lock lock(mutex, boost::try_to_lock); 
     if (lock) 
     { 
      fprintf(stderr, "Locked by B\n"); 
      usleep(100000); 
      fprintf(stderr, "Unlocked by B\n"); 
      i--; 
     } 
     else 
     { 
      fprintf(stderr, "Lock failed in B\n"); 
      usleep(100000); 
     } 
    } 
} 

int main(int argc, char **argv) 
{ 
    boost::thread a(threadA); 
    boost::thread b(threadB); 
    a.join(); 
    b.join(); 
} 

をそして私は、出力

Locked by A 
Lock failed in B 
Lock failed in B 
Unlocked by A 
Locked by A 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Unlocked by A 
Locked by A 
Lock failed in B 
Lock failed in B 
Unlocked by A 
Locked by A 
Unlocked by A 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
Locked by B 
Unlocked by B 
関連する問題