13

デッドロックのリスクを冒さずに複数のロックを取得したい場合は、次のstd::lock関数を使用できます。

int data1, data2;
std::mutex m1, m2;
std::unique_lock<std::mutex> lock1(m1, std::defer_lock);
std::unique_lock<std::mutex> lock2(m2, std::defer_lock);

std::lock(lock1, lock2);           // guaranteed deadlock-free

// work with data1 and data2

しかし、指定された期間内にロックを取得し、それ以外の場合はタイムアウトしたい場合はどうなりますか?先物や条件変数try_untilに似たロックに似たものがない理由はありますか?wait_until

4

2 に答える 2

14

std :: lockでタイムアウトがサポートされていないのはなぜですか?

  1. 誰もそれを提案しなかったからです。

  2. この分野は非常に物議を醸しているため、提案が少ないほど、受け入れられる可能性が高くなります。

  3. すべてを標準化すると退屈するのではないかと心配していたからです。

  4. それは読者のための練習問題として残されました。

うーん...アイデアが足りなくなった...:-)

おー!

必要に応じて、自分で行うのは簡単です。

アップデート

これが私がもっと好きな書き直しです:

#include <mutex>
#include <chrono>

template <class Clock, class  Duration, class L0, class L1>
int
try_lock_until(std::chrono::time_point<Clock, Duration> t, L0& l0, L1& l1)
{
    std::unique_lock<L0> u0(l0, t);
    if (u0.owns_lock())
    {
        if (l1.try_lock_until(t))
        {
            u0.release();
            return -1;
        }
        else
            return 1;
    }
    return 0;
}

template <class Rep, class  Period, class L0, class L1>
int
try_lock_for(std::chrono::duration<Rep, Period> d, L0& l0, L1& l1)
{
    return try_lock_until(std::chrono::steady_clock::now() + d, l0, l1);
}


int main()
{
    std::timed_mutex  m1, m2;
    try_lock_for(std::chrono::milliseconds(50), m1, m2);
}

アンソニーが示唆するように、これを自由に提案してください。また、お気軽にご利用いただき、実際に役立ったかどうかをお知らせください。

于 2012-09-24T17:05:29.510 に答える
11

std::timed_mutextry_lock_untiltry_lock_forメンバー関数があります。std::lockただし、タイムアウトを使用するのと同等のものはありません。

タイムアウトを使用してミューテックスをロックすることは、特定のニッチでのみ使用されます。タイムアウトを使用して複数のミューテックスをロックすることは、誰もが提案するのに十分なほど強く感じたものではなかったため、C++11にはありません。

標準化委員会は現在、次の標準化の提案を積極的に求めています。タイムアウトを意識した同等のものが価値があると感じたらstd::lock、提案を書いてみませんか?

于 2012-09-24T16:58:47.017 に答える