Как я могу получить последовательные идентификаторы потока - PullRequest
2 голосов
/ 07 апреля 2020

У меня есть проект c ++ linux, состоящий из отдельных исполняемых файлов производителя и потребителя. Producer имеет несколько потоков, и каждый поток имеет свою область общей памяти, которая будет использоваться для межпроцессного взаимодействия. Потоки запускаются сторонней библиотекой, и я не могу легко передать им пользовательские параметры.

Моя проблема в том, что мне нужен способ настроить потоки для записи в различные области общей памяти, чтобы избежать гонок и locks.

До сих пор я придумал следующее решение:

static size_t get_thread_index() {
    static std::mutex once;
    std::lock_guard<std::mutex> guard(once);

    static std::map<pid_t, size_t> id_map;

    pid_t tid = syscall(SYS_gettid);

    auto it = id_map.find(tid);

    if (it != id_map.end()) {
        return it->second;
    } else {
        assert(id_map.size() < SHM_QUEUE_MAX_NODES);
        return (id_map[tid] = id_map.size());
    }
}

, а затем внутри производителя

static thread_local size_t node_id = get_thread_index();
(*shm_q)[write_node_id] ...

Но это решение кажется полным излишним для таких простое задание.

Я не могу просто использовать такие вещи, как syscall(SYS_gettid) % NUMBER_OF_THREADS, потому что нет никаких гарантийных идентификаторов потоков, которые были бы последовательными.

Есть ли простой способ сделать это?

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Есть ли простой способ сделать это?

Вместо того, чтобы иметь центральный реестр последовательных номеров потоков, как насчет простого наличия центрального генератор для последовательных номеров потоков? Каждый поток получает свой номер (один раз) и сохраняет его где-то под своим контролем. И вы можете реализовать это с помощью простого атома c integer:

static std::atomic_uint next_thread_number(0);

Каждый поток может затем просто сделать ...

unsigned int my_thread_number = next_thread_number++;

..., поскольку оператор ++ std::atomic выполняет атоми c операция чтения-изменения-записи.

0 голосов
/ 07 апреля 2020

Есть ли простой способ сделать это?

Нет API или требования для генерации идентификаторов процессов / потоков определенным образом.

Вы следует использовать таблицу ha sh (например, std::unordered_map) для сопоставления pid_t или tid_t с числом из указанного диапазона c.

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