【问题标题】:giving an id to semaphore给信号量一个 id
【发布时间】:2012-03-11 23:51:43
【问题描述】:

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

map<sem_t, int> sem_map;

这样 key(sem_t) 的计数作为映射中的值。

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

【问题讨论】:

  • 你能不能存储类似 map sem_map 的东西,其中 threadID 是你的键,你的联合类型是值?否则,您需要声明并定义一个类来保存您的信号量、最大线程数、当前线程数、线程 ID 和可选字符串标识符
  • 嗨,我想是的,只是想保持简单。

标签: c++ synchronization pthreads semaphore


【解决方案1】:

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

map<sem_t*, int> sem_map;

然后,给定一个 sem_t x,您可以使用以下方法访问映射中的 int 值:

sem_map.find(&x);

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

编辑:您不能在地图中使用 sem_t 作为键的原因是 std::map 要求键类型具有 operator

【讨论】:

  • 顺便说一句,你能解释一下为什么 c++ 不允许 sem_t 而是允许 sem_t* 吗?
  • 明白了。当我尝试调试时,它把我带到了
  • 在任何情况下复制sem_t 对象都不是一个好主意。它可能经常起作用,但正如 posix 规范所说,“对信号量副本的引用会产生未定义的结果”。
  • 我刚刚添加了该注释作为提醒。复制信号量不是我通常做的事情:P.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-31
  • 1970-01-01
相关资源
最近更新 更多