在线文档教程
C++
线程支持 | Thread support

std::notify_all_at_thread_exit

STD:通知[医]全[医]在[医]螺纹[医]出口

Defined in header
void notify_all_at_thread_exit( std::condition_variable& cond, std::unique_lock<std::mutex> lk (since C++11)

notify_all_at_thread_exit提供一种机制,通知其他线程给定线程已完全完成,包括销毁所有线程。螺纹[医]局部物品。它的运作如下:

  • 先前获得的锁的所有权lk转移到内部存储。

  • 执行环境被修改,以便当当前线程退出时,条件变量。cond通知如下:

lk.unlock( cond.notify_all(

暗含lk.unlock后序中定义的28名ASstd::memory_order%29销毁所有物体线程本地存储持续时间与当前线程关联。

所提供的设施可达到同等效果。std::promisestd::packaged_task...

注记

调用此函数如果lock.mutex()不被当前线程锁定是未定义的行为。

调用此函数如果lock.mutex()与当前正在等待相同条件变量的所有其他线程使用的互斥对象不同,这是未定义的行为。

提供的锁lk直到线程退出为止。一旦调用了此函数,就不会再有线程获得相同的锁以等待cond如果某个线程正在此条件变量上等待,则当锁被伪造唤醒时,它不应试图释放和重新获取锁。

在典型的用例中,这个函数是分离线程调用的最后一个函数。

参数

cond-the condition variable to notify at thread exit
lk-the lock associated with the condition variable cond

返回值

%280%29

这个部分代码片段说明了如何notify_all_at_thread_exit可用于避免访问依赖于线程局部变量的数据,而这些线程局部变量正在被销毁:

二次

#include <mutex> #include <thread> #include <condition_variable> 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 }

二次

另见

set_value_at_thread_exitsets the result to specific value while delivering the notification only at thread exit (public member function of std::promise)
make_ready_at_thread_exitexecutes the function ensuring that the result is ready only once the current thread exits (public member function of std::packaged_task)

© cppreference.com

在CreativeCommonsAttribution下授权-ShareAlike未移植许可v3.0。

http://en.cppreference.com/w/cpp/线程/Notification[医]全[医]在[医]螺纹[医]出口