gpt4 book ai didi

c++ - 如何在线程退出时触发代码,而不使用函数 *_at_thread_exit?

转载 作者:太空狗 更新时间:2023-10-29 23:05:30 26 4
gpt4 key购买 nike

假设我的应用程序中有两个线程,我需要在另一个线程退出时通知我的主线程。

我知道 C++11 提供了 std::notify_all_at_thread_exit(),或者 std::promise::set_{value,exception}_at_thread_exit(),这正是我正在寻找的,但是我使用的 STL 版本 (4.7.2) 尚未实现这些功能(参见 this page 上的第 30.5 和 30.6.5 点)。

我有机会模仿吗?谢谢,

最佳答案

如果您不介意使用 Boost,可以使用 boost::notify_all_at_thread_exit()在 Boost.Thread 中。

这也可以使用 线程局部变量 来完成,该变量在析构函数中注册回调。这实际上是libc++中函数的实现方式。不幸的是,gcc 4.7 还不支持 thread_local 存储类,所以这行不通。

但是如果我们被允许使用 POSIX 线程函数,那么我们可以使用 pthread_key_create 将析构函数关联到 TLS,这允许我们将函数模拟为:

void notify_all_at_thread_exit(std::condition_variable& cv,
std::unique_lock<std::mutex> lock) {
using Arg = std::tuple<pthread_key_t,
std::condition_variable*,
std::unique_lock<std::mutex>>;

pthread_key_t key;
pthread_key_create(&key, [](void* value) {
std::unique_ptr<Arg> arg (static_cast<Arg*>(value));
std::get<2>(*arg).unlock();
std::get<1>(*arg)->notify_all();
pthread_key_delete(std::get<0>(*arg));
});

pthread_setspecific(key, new Arg(key, &cv, std::move(lock)));
}

(这只针对一个变量进行了优化。您可以更改它以注册一堆条件变量。)

关于c++ - 如何在线程退出时触发代码,而不使用函数 *_at_thread_exit?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19176538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com