Как отобразить идентификаторы системных потоков Linux и std :: thread :: id? - PullRequest
0 голосов
/ 15 октября 2018

Я могу перечислить все потоки текущего процесса через /proc/self/task, как описано здесь .Как я могу сопоставить эти идентификаторы потоков с std::thread::id -s, если есть библиотеки, созданные моими библиотеками?

Например, эта программа :

#include <iostream>
#include <thread>
#include <vector>

#include <errno.h>
#include <sched.h>
#include <sys/types.h>
#include <dirent.h>

int main()
{
    auto get_thread_ids = [] () -> std::vector<int>
    {
        std::unique_ptr<DIR, int (*)(DIR*)> self_dir{opendir("/proc/self/task"), &closedir};
        if (!self_dir)
            return {};

        std::vector<int> ret{};
        struct dirent *entry = nullptr;
        while ((entry = readdir(self_dir.get())) != nullptr)
        {
            if (entry->d_name[0] == '.')
                continue;

            ret.emplace_back(std::stoi(entry->d_name));
        }
        return ret;
    };

    std::cout << "main   " << std::this_thread::get_id() << std::endl;
    std::thread t{
        [](){
            std::cout << "thread " << std::this_thread::get_id() << std::endl;
            std::this_thread::sleep_for(std::chrono::seconds{5});            
        }
    };

    for (const auto& i : get_thread_ids())
        std::cout << "tid: " << i << std::endl;

    t.join();
}

печатает это:

main   140125847566144
tid: 31383
tid: 31384
thread 140125829990144

Я хочу установить переписку: 31383->140125847566144, 31384->140125829990144.

1 Ответ

0 голосов
/ 15 октября 2018

Вам необходимо либо иметь доступ к самим std::thread объектам, и использовать native_handle.

, либо вам нужно иметь возможность контролировать, что выполняется в этих потоках, и в этом случае вы можете вызывать std::this_thread::get_id для стандартного идентификатора и pthread_self для собственного идентификатора.

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