У меня есть проект 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
, потому что нет никаких гарантийных идентификаторов потоков, которые были бы последовательными.
Есть ли простой способ сделать это?