0

scoped_lock で timed_mutex の両方を使用しようとしています。以前、いくつかの例に従って scoped_lock を正常に使用したことがありますが、今ではうまくいかないようで、ブーストのドキュメントを正しく理解することもできません。

望ましい動作は次のとおりです: scoped_lock の取得を x 時間試行し、成功した場合は true を返し、それ以外の場合は false を返します。

現在私は持っています:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

ただし、このscoped_lockがブール値を返すかどうかを(ブーストのドキュメントまたは例を介して)見つけようとすると、何も見つからないか、実際に異なる方法が見つかります。

したがって、私はそれを行う正しい方法は何か、それはどのように正確に機能するのか、そしてブーストのドキュメントをどのように正しく「読む」かについてのいくつかの指示を尋ねます.

アップデート:

そう

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex, boost::get_system_time() + boost::posix_time::miliseconds(10));

if(scoped_lock.owns_lock()) {
    // exclusive code 
}

scoped_lock.owns_lock() でロックしようとすると、10 ミリ秒 (この場合) の間にロックを取得しようとし、時間切れでロックが取得されなかった場合に false を返すミューテックスを作成しますか?

4

1 に答える 1

2

ドキュメントを見ると、boost::timed_mutex::scoped_lockは次の単なるエイリアスですboost::unique_lock<timed_mutex>

class timed_mutex:
    boost::noncopyable
{
public:
    // ...

    typedef unique_lock<timed_mutex> scoped_timed_lock;
    typedef unspecified-type scoped_try_lock;
    typedef scoped_timed_lock scoped_lock;

    // ...
};

のドキュメントを確認するとboost::unique_lock、ロックを所有しているかどうかを判断する方法が 2 つあります。

template<typename Lockable>
class unique_lock
{
public:
    // ...

    explicit operator bool() const noexcept;
    bool owns_lock() const noexcept;

    // ...
};

したがって、次のいずれかを行うことができます

if(scoped_lock) {
    // we have the lock, yay!
}

また

if(scoped_lock.owns_lock()) {
    // we have the lock, yay!
}

ちなみに、unique_lock には、相対時間を chrono::duration として取るコンストラクターがあります。これは、絶対時間を使用するよりもクリーンである場合とそうでない場合があります。

編集:このコードを考えると:

boost::timed_mutex _mutex;
boost::timed_mutex::scoped_lock scoped_lock(_mutex,
           boost::get_system_time() + boost::posix_time::miliseconds(10)); // <-- attempt to acquire mutex happens here!

if(scoped_lock.owns_lock()) {
    // exclusive code 
}

ミューテックスを取得しようとする試みは、ロックowns_lock()が呼び出されたときではなく、ロックが構築されたときに発生します。はい、ミューテックスの取得に成功した場合にのみ排他コードが実行されます。「false を返す」の意味がわかりません。このコードは何も返しません。が false を返す場合owns_lock()は、mutex の取得に失敗したため、排他コードを実行できません。このことを任意の方法で呼び出し元に伝えることができます。

于 2014-06-07T13:59:09.067 に答える