使用boost::thread
如何从该函数中获取指向当前正在执行我的函数的boost::thread
的指针?
以下内容无法为我编译:
boost::thread *currentThread = boost::this_thread;
答案 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.html或http://www.boost.org/doc/libs/1_60_0/doc/html/thread.html,如果第一个链接被破坏),您会发现 没有提供em> 函数来获取指向代表当前线程的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实际上正在使用这个解决方案。好吧 - 我仍然认为正式发布你的问题的答案以及(工作)潜在解决方案的示例代码是有用和完整的。