Namespaces
Variants

std::promise<R>:: set_exception

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
void set_exception ( std:: exception_ptr p ) ;
(seit C++11)

Speichert atomar den Ausnahmepointer p im gemeinsamen Zustand und macht den Zustand bereit.

Die Operation verhält sich so, als würden set_value , set_exception , set_value_at_thread_exit und set_exception_at_thread_exit einen einzelnen Mutex assoziiert mit dem Promise-Objekt erwerben, während sie das Promise-Objekt aktualisieren.

Eine Ausnahme wird ausgelöst, wenn kein gemeinsamer Zustand vorhanden ist oder der gemeinsame Zustand bereits einen Wert oder eine Ausnahme speichert.

Aufrufe dieser Funktion führen nicht zu Datenrennen mit Aufrufen von get_future (daher müssen sie nicht miteinander synchronisiert werden).

Inhaltsverzeichnis

Parameter

p - Ausnahmezeiger zum Speichern. Das Verhalten ist undefiniert, wenn p null ist

Rückgabewert

(keine)

Exceptions

std::future_error unter den folgenden Bedingungen:

  • * this besitzt keinen gemeinsamen Zustand. Der Fehlercode wird auf no_state gesetzt.

Beispiel

#include <future>
#include <iostream>
#include <thread>
int main()
{
    std::promise<int> p;
    std::future<int> f = p.get_future();
    std::thread t([&p]
    {
        try
        {
            // Code, der eine Exception werfen könnte
            throw std::runtime_error("Example");
        }
        catch (...)
        {
            try
            {
                // Speichere jegliche geworfene Exception im Promise
                p.set_exception(std::current_exception());
                // Oder werfe stattdessen eine benutzerdefinierte Exception
                // p.set_exception(std::make_exception_ptr(MyException("mine")));
            }
            catch (...) {} // set_exception() könnte ebenfalls werfen
        }
    });
    try
    {
        std::cout << f.get();
    }
    catch (const std::exception& e)
    {
        std::cout << "Exception from the thread: " << e.what() << '\n';
    }
    t.join();
}

Ausgabe:

Exception from the thread: Example

Siehe auch

setzt das Ergebnis, um eine Ausnahme anzuzeigen, während die Benachrichtigung nur beim Thread-Ende übermittelt wird
(öffentliche Mitgliedsfunktion)