Boost :: thread如何获取指向调用函数的线程的指针?

时间:2011-07-16 04:35:48

标签: c++ multithreading boost boost-thread

使用boost::thread如何从该函数中获取指向当前正在执行我的函数的boost::thread的指针?

以下内容无法为我编译:

boost::thread *currentThread = boost::this_thread;

3 个答案:

答案 0 :(得分:3)

您可以使用boost :: this_thread引用您使用它的相同线程。

请参阅http://www.boost.org/doc/libs/1_41_0/doc/html/thread/thread_management.html

答案 1 :(得分:3)

你必须要小心,因为boost::thread是一种可移动的类型。请考虑以下事项:

boost::thread
make_thread()
{
    boost::thread thread([](boost::thread* p)
    {
        // here p points to the thread object we started from
    }, &thread);
    return thread;
}

// ...
boost::thread t = make_thread();
// if the thread is running by this point, p points to an non-existent object

boost::thread对象概念上与一个线程相关联,但是它没有规范地与它相关联,即在线程过程中可能有多个线程对象与之关联(在给定时间不超过一个)。这就是为什么boost::thread::id在这里的部分原因。那么你想要达到的目标是什么?

答案 2 :(得分:0)

如果您完整地搜索Boost Thread文档(http://www.boost.org/doc/libs/release/doc/html/thread.htmlhttp://www.boost.org/doc/libs/1_60_0/doc/html/thread.html,如果第一个链接被破坏),您会发现 没有 函数来获取指向代表当前线程的boost::thread对象的指针。

然而,你可以自己解决这个问题;一种解决方案是使用映射,将boost::thread:id映射到boost:thread*,然后从线程中访问该映射以获取指针。

例如:

#include <cstdio>
#include <map>

#include <boost/thread/thread.hpp>
#include <boost/thread/mutex.hpp>

std::map<boost::thread::id, boost::thread*> threadsMap;
boost::mutex threadsMapMutex;  // to synchronize access to the map

boost::mutex stdoutMutex;  // to synchronize access to stdout

void thread_function()
{
    threadsMapMutex.lock();

    // get a pointer to this thread
    boost::thread::id id = boost::this_thread::get_id();
    boost::thread* thisThread = threadsMap.find(id)->second;

    threadsMapMutex.unlock();

    // do whatever it is that you need to do with the pointer

    if(thisThread != NULL)
    {
        stdoutMutex.lock();
        printf("I have a pointer to my own thread!\n");
        stdoutMutex.unlock();
    }
}

int main()
{
    threadsMapMutex.lock();

    // create the threads
    boost::thread thread1(&thread_function);
    boost::thread thread2(&thread_function);

    // insert the threads into the map
    threadsMap.insert(std::pair<boost::thread::id, boost::thread*>(thread1.get_id(), &thread1));
    threadsMap.insert(std::pair<boost::thread::id, boost::thread*>(thread2.get_id(), &thread2));

    threadsMapMutex.unlock();

    // join the threads
    thread1.join();
    thread2.join();

    return 0;
}

P.S。我刚刚注意到你已经写过这个,你posted in a comment实际上正在使用这个解决方案。好吧 - 我仍然认为正式发布你的问题的答案以及(工作)潜在解决方案的示例代码是有用和完整的。