4

boost::mutexBoostのドキュメントによるとboost::timed_mutex、異なるはずです。最初のものはを実装Lockable Conceptし、2番目は-を実装しTimedLockable Conceptます。

しかし、ソースを見ると、基本的に同じものであることがわかります。唯一の違いはlocktypedefです。呼び出したり、タイムアウトで使用timed_lockしたりできます。boost::mutexboost::unique_lock

typedef ::boost::detail::basic_timed_mutex underlying_mutex;
class mutex:
    public ::boost::detail::underlying_mutex

class timed_mutex:
    public ::boost::detail::basic_timed_mutex

その背後にある理論的根拠は何ですか?boost::mutexそれは過去の名残ですか、それをとして使用するのは間違っていTimedLockableますか?結局のところ、それは文書化されていません。

4

1 に答える 1

3

ソースを見ていませんが、数日前にこれらを使用しましたが、時限ミューテックスの機能が異なります。彼らは時間切れになるまでブロックし、その後戻ってきます。一意のロックは、ロックを取得できるまでブロックされます。

try lock はブロックされないため、ロックの所有権があるかどうかをテストできます。時限ロックは、指定された時間だけブロックし、その後ロック試行として動作します。つまり、ブロックを停止し、ロックの所有権をテストできます。

内部的には、さまざまなブースト ロックの一部が一意のロックの typedef になっていると思います。それらはすべて一意のロックを使用しているためです。typedef 名が存在するのは、別の機能を使用してクライアント コードを混乱させる可能性がある場合でも、別の名前を何に使用しているかを追跡できるようにするためです。

編集:これは時限ロックの例です:

boost::timed_mutex timedMutexObj;
boost::mutex::scoped_lock scopedLockObj(timedMutexObj, boost::get_system_time() + boost::posix_time::seconds(60));
if(scopedLockObj.owns_lock()) {
    // proceed
}

参考: http://www.boost.org/doc/libs/1_49_0/doc/html/thread/synchronization.html#thread.synchronization.mutex_concepts.timed_lockable.timed_lock

もう一度編集: あなたの質問に具体的な回答を提供するには、はい、この目的のために提供されているのでboost::mutex、として使用するのは間違っています。それらがソースで同じものであり、これが文書化されていない場合、これは信頼できない動作であり、文書に従う必要があります。(私のコード例は最初は使用されていませんでしたが、更新しました)TimedLockableboost::timed_mutextimed_mutex

于 2012-05-25T14:55:42.253 に答える