давая идентификатор семафору - PullRequest
0 голосов
/ 12 марта 2012

Здравствуйте, я хочу сохранить список созданных семафоров и их разрешенное количество (ни одному из экземпляров потока не разрешен доступ к этому семафору). Я пытался с картой в STL, как

map<sem_t, int> sem_map;

чтобы ключ (sem_t) имел значение в качестве значения на карте.

но c ++ не позволяет мне использовать sem_t в качестве ключа, так как это (sem_t) тип объединения. Итак, как мне сохранить список семафоров? Моя цель - всякий раз, когда я хочу заблокировать или разблокировать семафор, я сначала получаю идентификатор семафора из моего поддерживаемого списка и выполняю некоторую предварительную обработку с ним.

1 Ответ

2 голосов
/ 12 марта 2012

Вы можете использовать адрес 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>

...