给信号量一个id

时间:2012-03-11 23:51:44

标签: c++ synchronization pthreads semaphore

您好我想维护一个创建的信号量列表及其允许的计数(没有允许访问该信号量的线程实例)值。我尝试使用stl中的地图

map<sem_t, int> sem_map;

以便键(sem_t)将计数作为地图中的值。

但是c ++不允许我使用sem_t作为键,因为它是(sem_t)一个联合类型。那么,我如何维护信号量列表呢?我的目标是每当我想锁定或解锁信号量时,我首先从我维护的列表中获取信号量的id,并使用它进行一些预处理。

1 个答案:

答案 0 :(得分:2)

您可以使用sem_t的地址作为密钥:

map<sem_t*, int> sem_map;

然后,给定sem_t x,您可以使用:

访问地图中的int值
sem_map.find(&x);

请注意,此解决方案仅在您不复制信号量时才有效。

编辑:你不能在地图中使用sem_t作为键的原因是std :: map要求键类型具有运算符&lt;定义(为了进行内部排序,std :: map是树结构)。但是,联盟没有运营商&lt;定义,所以编译器不会让你使用它。另一方面,可以在它们之间比较指针,因此编译器实际上允许您将它们用作std :: map中的键。