Namespaces
Variants

std::shared_timed_mutex:: try_lock_for

From cppreference.net

Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
template < class Rep, class Period >
bool try_lock_for ( const std:: chrono :: duration < Rep, Period > & timeout_duration ) ;
(seit C++14)

Versucht, den Mutex zu sperren. Blockiert bis die angegebene Dauer timeout_duration abgelaufen ist (Timeout) oder die Sperre erworben wurde (den Mutex besitzt), je nachdem, was zuerst eintritt. Bei erfolgreichem Sperrenrwerb 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 länger blockieren als timeout_duration aufgrund von Planungs- oder Ressourcenkonfliktverzögerungen.

Der Standard empfiehlt, dass eine std::steady_clock zur Messung der Dauer verwendet wird. Falls eine Implementierung stattdessen eine std::system_clock verwendet, kann die Wartezeit auch anfällig für Uhr-Anpassungen sein.

Wie bei try_lock() ist es dieser Funktion erlaubt, fälschlicherweise zu scheitern und false zurückzugeben, selbst wenn das Mutex zu keinem Zeitpunkt während der timeout_duration durch einen anderen Thread gesperrt war.

Ein vorheriger unlock() -Vorgang auf demselben Mutex synchronisiert mit (wie definiert in std::memory_order ) diesem Vorgang, falls er true zurückgibt.

Wenn try_lock_for von einem Thread aufgerufen wird, der den Mutex bereits in einem beliebigen Modus (shared oder exclusive) besitzt, ist das Verhalten undefiniert.

Inhaltsverzeichnis

Parameter

timeout_duration - Mindestdauer für die Blockierung

Rückgabewert

true wenn die Sperre erfolgreich erworben wurde, andernfalls false .

Exceptions

Jede Ausnahme, die von timeout_duration geworfen wird (von der Standardbibliothek bereitgestellte Dauern werfen niemals Ausnahmen).

Beispiel

#include <chrono>
#include <iostream>
#include <mutex>
#include <sstream>
#include <thread>
#include <vector>
using namespace std::chrono_literals;
std::mutex cout_mutex; // Zugriff auf std::cout steuern
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

Siehe auch

sperrt das Mutex, blockiert falls das Mutex nicht verfügbar ist
(öffentliche Elementfunktion)
versucht das Mutex zu sperren, kehrt zurück falls das Mutex nicht verfügbar ist
(öffentliche Elementfunktion)
versucht das Mutex zu sperren, kehrt zurück falls das Mutex
bis zum Erreichen des angegebenen Zeitpunkts nicht verfügbar war
(öffentliche Elementfunktion)
entsperrt das Mutex
(öffentliche Elementfunktion)