我使用的地图如下:
键--->任务ID
值---> pthread_cond_t
个对象
当某项任务完成后,我会使用匹配的pthreads
元素唤醒与其关联的所有pthread_cond_t
。
我的问题很简单 - 什么是pthread_cond_t
?它是一个对象吗?因为如果我删除它,地图会调用它的构造函数,这对我不利。如果不是 - 我可以返回
pthread_cond_t cond = *(_flushCond->operator [](task_id)); //map of conditions
_flushCond->operator [](task_id) = NULL;
return cond;
我想要做的是释放地图中的对象供以后使用(我重用ID)并返回那里的pthread_cond_t
对象。
答案 0 :(得分:3)
正如其他人所评论的那样,对于实现定义的类型,它是一个opaque类型(或者如果你愿意的话)。在一些实现中,它可以是指向实际条件变量结构的指针,该结构本身仅是指向某个实现内部数据结构的指针。 POSIX标准对此没有任何保证或承诺,并且只允许您使用该类型的“对象”执行某些操作。在这方面,它与其他类型的Pthread非常相似,例如pthread_mutex_t或pthread_t。
您无法安全地或至少可移植地将pthread_cond_t用作STL地图中的值。原因是,对值的要求是可复制构造和可配置的。虽然技术上对于pthread_cond_t是可行的,但它不是legal to do so。
您应该存储pthread_cond_t *(指针),就像使用其他不可“复制”的类型一样。