Namensräume
Varianten
Aktionen

std::recursive_timed_mutex::try_lock_for

Von cppreference.com
 
 
Bibliothek für nebenläufige Programmierung
Threads
(C++11)
(C++20)
this_thread Namespace
(C++11)
(C++11)
(C++11)
Kooperatives Beenden
Gegenseitiger Ausschluss
(C++11)
Allgemeines Sperrungsmanagement
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Bedingungsvariablen
(C++11)
Semaphoren
Latches und Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
(C++11)
Sichere Wiederherstellung
(C++26)
Hazard Pointer
Atomare Typen
(C++11)
(C++20)
Initialisierung von atomaren Typen
(C++11)(veraltet in C++20)
(C++11)(veraltet in C++20)
Speicherordnung
(C++11)(deprecated in C++26)
Freie Funktionen für atomare Operationen
Freie Funktionen für atomare Flags
 
 
template< class Rep, class Period >
bool try_lock_for( const std::chrono::duration<Rep, Period>& timeout_duration );
(seit C++11)

Versucht, die Mutex zu sperren. Blockiert, bis die angegebene Dauer timeout_duration abgelaufen ist (Timeout) oder die Sperre erworben wurde (besitzt den Mutex), je nachdem, was zuerst eintritt. Bei erfolgreichem Erwerb der Sperre wird true zurückgegeben, andernfalls false.

Wenn timeout_duration kleiner oder gleich timeout_duration.zero() ist, verhält sich die Funktion wie try_lock().

Diese Funktion kann aufgrund von Planungs- oder Ressourcenkonfliktverzögerungen länger als timeout_duration blockieren.

Der Standard empfiehlt die Verwendung von std::steady_clock zur Messung der Dauer. Wenn eine Implementierung stattdessen std::system_clock verwendet, kann die Wartezeit auch empfindlich auf Uhrenanpassungen reagieren.

Wie bei try_lock() darf diese Funktion aus beliebigem Grund fehlschlagen und false zurückgeben, auch wenn die Mutex zu keinem Zeitpunkt während timeout_duration von keinem anderen Thread gesperrt war.

Ein vorheriger unlock()-Vorgang für dieselbe Mutex synchronisiert sich mit (gemäß Definition in std::memory_order) diesem Vorgang, wenn dieser true zurückgibt.

Ein Thread kann wiederholt `try_lock_for` für eine rekursive Mutex aufrufen. Erfolgreiche Aufrufe von `try_lock_for` erhöhen den Besitzzähler: Die Mutex wird erst freigegeben, nachdem der Thread die entsprechende Anzahl von Aufrufen von unlock() durchgeführt hat.

Die maximale Anzahl von Besitzebenen ist nicht spezifiziert. Ein Aufruf von `try_lock_for` gibt false zurück, wenn diese Zahl überschritten wird.

Inhalt

[bearbeiten] Parameter

timeout_duration - minimale Dauer für das Blockieren

[bearbeiten] Rückgabewert

true, wenn die Sperre erfolgreich erworben wurde, andernfalls false.

[bearbeiten] Ausnahmen

Alle von timeout_duration geworfenen Ausnahmen (Dauern, die von der Standardbibliothek bereitgestellt werden, werfen niemals Ausnahmen).

[bearbeiten] Beispiel

#include <chrono>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <vector>
 
using namespace std::chrono_literals;
 
std::mutex cout_mutex; // control access to std::cout
std::timed_mutex mutex;
 
void job(int id)
{
    std::ostringstream stream;
 
    for (int i = 0; i < 3; ++i)
    {
        if (mutex.try_lock_for(100ms))
        {
            stream << "success ";
            std::this_thread::sleep_for(100ms);
            mutex.unlock();
        }
        else
            stream << "failed ";
 
        std::this_thread::sleep_for(100ms);
    }
 
    std::lock_guard<std::mutex> lock{cout_mutex};
    std::cout << '[' << id << "] " << stream.str() << '\n';
}
 
int main()
{
    std::vector<std::thread> threads;
    for (int i{0}; i < 4; ++i)
        threads.emplace_back(job, i);
 
    for (auto& th : threads)
        th.join();
}

Mögliche Ausgabe

[0] failed failed failed 
[3] failed failed success 
[2] failed success failed 
[1] success failed success

Defect reports

Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
LWG 2093 C++11 try_lock_for warf nichts wirft Timeout-bezogene Ausnahmen

[bearbeiten] Siehe auch

sperrt den Mutex, blockiert, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex nicht verfügbar ist
(public member function) [edit]
versucht, den Mutex zu sperren, kehrt zurück, wenn der Mutex
bis zum Erreichen des angegebenen Zeitpunktpunkts nicht verfügbar
(public member function) [edit]
entsperrt den Mutex
(public member function) [edit]