Boost :: thread, как получить указатель на поток, где вызывается моя функция? - PullRequest
4 голосов
/ 16 июля 2011

С boost::thread как мне получить указатель на boost::thread, который в данный момент выполняет мою функцию, из этой функции?

Для меня не компилируется следующее:

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

Ответы [ 3 ]

3 голосов
/ 16 июля 2011

Вы должны быть осторожны, потому что 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

A boost::thread объект концептуально связан с потоком, но не канонически связан с ним, т. Е. В течение потока с ним может быть связано более одного объекта потока (только не более) чем один в данный момент). Отчасти поэтому boost::thread::id здесь. Так чего именно вы хотите достичь?

3 голосов
/ 16 июля 2011

Вы можете использовать boost :: this_thread для ссылки на тот же поток, в котором вы его используете.

См. http://www.boost.org/doc/libs/1_41_0/doc/html/thread/thread_management.html

0 голосов
/ 09 февраля 2016

Если вы просматриваете всю документацию 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, если эта первая ссылка не работает), вы обнаружите, что нет предусмотрена функция для получения указателя на объект boost::thread, представляющий текущий поток.

Вы можете решить эту проблему самостоятельно, однако; Одним из решений будет использование карты, сопоставление boost::thread:id s с boost:thread* s, а затем доступ к этой карте из вашего потока, чтобы получить указатель.

Например:

#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. Я только что заметил, что вы опубликовали в комментарии , что вы на самом деле используете это решение, после того, как уже написали это. Ну что ж, я все еще считаю полезным и полным официально опубликовать ответ на ваш вопрос, а также (рабочий) пример кода для потенциального решения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...