Пространства имён
Варианты
Действия

std::notify_all_at_thread_exit

Материал из cppreference.com
< cpp‎ | thread

 
 
Библиотека поддержки потоков
Потоки
Оригинал:
Threads
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
thread(C++11)
this_thread имен
Оригинал:
this_thread namespace
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
get_id(C++11)
yield(C++11)
sleep_for(C++11)
sleep_until(C++11)
Взаимное исключение
Оригинал:
Mutual exclusion
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
mutex(C++11)
timed_mutex(C++11)
Generic управления замком
Оригинал:
Generic lock management
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
lock_guard(C++11)
unique_lock(C++11)
defer_lock_t
try_to_lock_t
adopt_lock_t
(C++11)
(C++11)
(C++11)
lock(C++11)
try_lock(C++11)
defer_lock
try_to_lock
adopt_lock
(C++11)
(C++11)
(C++11)
Условия переменных
Оригинал:
Condition variables
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
condition_variable(C++11)
condition_variable_any(C++11)
notify_all_at_thread_exit(C++11)
cv_status(C++11)
Futures
Оригинал:
Futures
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
promise(C++11)
future(C++11)
shared_future(C++11)
packaged_task(C++11)
async(C++11)
launch(C++11)
future_status(C++11)
future_error(C++11)
future_category(C++11)
future_errc(C++11)
 
Определено в заголовочном файле <condition_variable>
void notify_all_at_thread_exit( std::condition_variable& cond,
                                std::unique_lock<std::mutex> lk );
(начиная с C++11)
notify_all_at_thread_exit предоставляет механизм для уведомления других потоков, что данный поток полностью закончен, в том числе уничтожая все thread_local объектов. Она работает следующим образом:
Оригинал:
notify_all_at_thread_exit provides a mechanism to notify other threads that a given thread has completely finished, including destroying all thread_local objects. It operates as follows:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
  • Право собственности на ранее приобретенные замок lk передается на внутреннюю память.
    Оригинал:
    Ownership of the previously acquired lock lk is transferred to internal storage.
    Текст был переведён автоматически используя Переводчик Google.
    Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

lk.unlock();
cond.notify_all();

Эквивалентный эффект может быть достигнут с помощью средств, предоставляемых std::promise или std::packaged_task.
Оригинал:
An equivalent effect may be achieved with the facilities provided by std::promise or std::packaged_task.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

Содержание

[править] Заметки

Вызов этой функции, если lock.mutex() не заблокирован текущим потоком неопределенное поведение.
Оригинал:
Calling this function if lock.mutex() is not locked by the current thread is undefined behavior.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вызов этой функции, если lock.mutex() это не то же мьютекса, который используется всеми другими потоками, которые в настоящее время ждет на той же переменной условие неопределенное поведение.
Оригинал:
Calling this function if lock.mutex() is not the same mutex as the one used by all other threads that are currently waiting on the same condition variable is undefined behavior.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Замок поставляется lk проводится, пока поток выходит. Как только эта функция была вызвана, не более потоков могут приобрести тот же замок для того, чтобы ждать на cond. Если некоторый поток ожидает на этой переменной условия, оно не должно пытаться освободить и выкупить замок, когда он просыпается, ложно.
Оригинал:
The supplied lock lk is held until the thread exits. Once this function has been called, no more threads may acquire the same lock in order to wait on cond. If some thread is waiting on this condition variable, it should not attempt to release and reacquire the lock when it wakes up spuriously.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
В типичных случаях использования этой функции является последней вещью, которую называют отдельные нить.
Оригинал:
In typical use cases, this function is the last thing called by a detached thread.
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Параметры

cond -
переменная условия уведомить в потоке выхода
Оригинал:
the condition variable to notify at thread exit
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
lk -
замок, связанный с cond переменной состояния
Оригинал:
the lock associated with the condition variable cond
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

[править] Возвращаемое значение

(Нет)

[править] Пример

Этот частичный фрагмент кода показывает, как notify_all_at_thread_exit могут быть использованы, чтобы избежать доступа к данным, что зависит от потока местных жителей в то время как поток местных жителей в процесс на грани уничтожения
Оригинал:
This partial code fragment illustrates how notify_all_at_thread_exit can be used to avoid accessing data that depends on thread locals while those thread locals are in the process of being destructed:
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

#include <mutex>
#include <thread>
 
std::mutex m;
std::condition_variable cv;
 
bool ready = false;
ComplexType result;  // some arbitrary type
 
void thread_func()
{
    std::unique_lock<std::mutex> lk(m);
    // assign a value to result using thread_local data
    result = function_that_uses_thread_locals();
    ready = true;
    std::notify_all_at_thread_exit(cv, std::move(lk));
} // 1. destroy thread_locals, 2. unlock mutex, 3. notify cv
 
int main()
{
    std::thread t(thread_func);
    t.detach();
 
    // do other work
    // ...
 
    // wait for the detached thread
    std::unique_lock<std::mutex> lk(m);
    while(!ready) {
        cv.wait(lk);
    }
    process(result); // result is ready and thread_local destructors have finished
}


[править] См. также

устанавливает результат определенное значение при доставке уведомлений только при выходе потока
Оригинал:
sets the result to specific value while delivering the notification only at thread exit
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::promise) [edit]
выполняет функцию обеспечения того, чтобы результат готов только один раз текущий поток существует
Оригинал:
executes the function ensuring that the result is ready only once the current thread exits
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.

(public функция-член std::packaged_task) [edit]