检查线程是否是增强螺纹

时间:2011-01-24 19:59:57

标签: c++ boost pthreads

出于线程局部清理的目的,我需要创建一个断言来检查当前线程是否是通过boost :: thread创建的。我怎样才能检查是否是这种情况?也就是说,我如何检查当前线程是否由boost :: thread?

处理

我只需要在线程退出时进行线程本地存储的清理。如果线程本身是一个提升线程,Boost的thread_local_ptr似乎只能工作。

请注意,我不是在清理时进行检查,而是在线程生命周期的某个时间进行检查。有些函数调用我们的API /回调(间接),导致我分配线程本地存储。只允许boost线程执行此操作,因此我需要在此时检测线程是否不是boost线程。


有关没有通用清理处理程序的问题,请参阅Destruction of static class members in Thread local storage。我回答了这一点,并意识到pthread_clenaup_push实际上不会起作用:它不会在线程的干净退出时被调用。


虽然我没有检测到提升线程的答案,但所选答案确实解决了问题的根源。 boost thread_specific_ptr将在任何pthread中调用它们的清理。它一定是别的东西导致它不适合我,因为一个孤立的测试表明它确实有效。

3 个答案:

答案 0 :(得分:3)

你的问题的前提是错误的:)即使线程不是一个提升线程,boost :: thread_specific_ptr仍然有效。想想看 - 主线程的线程特定存储如何工作,因为它不可能通过boost创建?我已经从主线程中使用了boost :: thread_specific_ptr,虽然我还没有检查过boost :: thread_specific_ptr的实现,但实现它的最明显的方法对于非boost线程也是有效的。大多数操作系统都允许您获取当前线程的唯一ID号,然后您可以将其用作映射/数组/哈希表的索引。

更有可能你有一个不同的错误,阻止你期望看到的行为发生。您应该使用一个小的可编译代码示例打开一个单独的问题,说明意外行为。

答案 1 :(得分:0)

你不能用静态断言做到这一点:这意味着你可以在编译时检测到它,这是不可能的。

假设您的意思是运行时检查:

如果你不将boost::thread与其他方法混合,那么问题就会消失。任何创建线程的库都应该已经自动处理自己的线程(或者每个关闭函数都必须调用你需要的API文件)。

否则,您可以保留一个不使用pthread_t创建的所有boost::thread的容器,并在关闭时检查该线程是否在容器中。如果它不在容器中,那么它是使用boost::thread创建的。

编辑:您是否考虑过设置应用程序以便API回调只能在使用boost::thread创建的线程中进行,而不是尝试检测它是否是使用boost::thread创建的?通过这种方式,您可以预先防止问题,并且无需进行检查,如果它存在,则实施起来会很痛苦。

答案 2 :(得分:0)

每次提升线程结束时,所有Thread Specific Data都会被清除。 TSD是一个指针,在销毁/重置时调用delete p*

可选地,代替delete p*,可以为每个项调用清理处理程序。该处理程序在TLS构造函数中指定,您可以使用清理函数进行一次清理。

#include <iostream>
#include <boost/thread/thread.hpp>
#include <boost/thread/tss.hpp>

void cleanup(int* _ignored) {
    std::cout << "TLS cleanup" << std::endl;
}

void thread_func() {
    boost::thread_specific_ptr<int> x(cleanup);
    x.reset((int*)1); // Force cleanup to be called on this thread

    std::cout << "Thread begin" << std::endl;
}

int main(int argc, char** argv) {
    boost::thread::thread t(thread_func);

    t.join();

    return 0;
}