Вы можете использовать адрес sem_t в качестве ключа:
map<sem_t*, int> sem_map;
Затем, получив sem_t x, вы можете получить доступ к значению int на карте, используя:
sem_map.find(&x);
Примечаниечто это решение работает, только если вы не копируете семафоры вокруг.
РЕДАКТИРОВАТЬ: причина, по которой вы не можете использовать sem_t в качестве ключей на вашей карте, состоит в том, что std :: map требует, чтобы у типа ключа был оператор <определено(для внутренней сортировки std :: map (s) являются древовидными структурами).Однако объединение не имеет оператора <определено, поэтому компилятор не позволит вам его использовать.С другой стороны, между ними можно сравнивать указатели, поэтому компилятор фактически позволит вам использовать их в качестве ключей в вашем std :: map. </p>