【问题标题】:winapi: get callback when thread endswinapi:线程结束时获取回调
【发布时间】:2020-12-24 04:38:36
【问题描述】:

我有一些 c++ 库代码,可以为每个访问它的线程创建一些簿记数据(基于线程 ID)。我想在线程结束时清理该数据。有没有办法(如果不是可移植的,那么使用 win-api)在线程结束时得到通知?

// 简化示例:

std::mutex mutex_;
std::unordered_map<std::thread::id, int> thread_accesses_;

void LibFunction() {
  std::thread::id thread_id = std::this_thread::get_id();
  mutex_.lock();
  std::unordered_map<std::thread::id, int>::const_iterator it = thread_accesses_.find(thread_id);
  if(it == thread_accesses_.end()) {
    thread_accesses_[thread_id] = 0;
  } else {
    thread_accesses_[thread_id]++;
  }
  mutex_.unlock();
}

【问题讨论】:

标签: c++ multithreading winapi


【解决方案1】:

线程本地存储既是 C++ 标准方式,也是平台方式。

C++ 有thread_local 关键字来声明线程局部变量。然后为构造它的每个线程调用该变量的析构函数。线程局部变量是为至少所有访问该变量的线程构造的,并且可能为其他线程构造。

Windows 具有线程本地存储作为系统机制。 thread_local就是通过这种机制实现的。

可以通过其他方式在 Windows 中进行线程退出回调:

  • 通过其他方式在模块中拥有线程本地数据和 TLS 回调
  • 使用 DllMain 回调
  • FlsAlloc 中传递 FlsCallback,纤程本地存储优于线程本地存储,并且在没有纤程的情况下,它的行为与线程本地存储完全相同

如果不能使用thread_local,但想要简单便携的东西,也可以考虑boost::thread_specific_ptr

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-28
    • 1970-01-01
    相关资源
    最近更新 更多