将pthread_mutex_t obj嵌入到C++obj实例中是个好主意吗?我想(遗憾的是)没有蝙蝠
Is it a good idea to embed a pthread_mutex_t obj into a C++ obj instance? I think (sadly) no bat
这个问题源于我通过pthread实现以下简单邮箱接口的努力:
typedef void* MailBox;
typedef enum MailBoxReturnValues {ok=0, fail4timeOut, fail} MailBoxReturnValues;
MailBox CreateMailBox (const char* const mailBoxName); /* returns NULL 4 fail */
MailBoxReturnValues DeleteMailBox (MailBox mailBox);
MailBoxReturnValues TxMailBox (MailBox mbx, void* sendingObj, unsigned timeoutInTic);
MailBoxReturnValues RxMailBox (MailBox mbx, void* *receivingObj, unsigned timeoutInTic);
为了实现它,我创建了一个C++类,在那里我放置了所有的suff,还有一个互斥体,它必须序列化对每个实例的访问。当我试图编写DeleteMailBox时,问题就出现了,因为我无法删除锁定的互斥体,但如果我解锁它,我就不能保证其他人可以访问正在删除的对象。(在我看来,锁定互斥锁的线程也应该有删除它的可能性)。
销毁应始终在外部同步。互斥锁(或任何本质上同步的对象)永远无法同步其自身的销毁。
您担心的竞争是,两个线程可能在同一个MailBox
对象上同时调用DeleteMailBox
和TxMailBox
。正如您所观察到的,MailBox
对象本身无法防止这种竞争。即使您可以破坏一个锁定的互斥体,另一个线程的并发锁定尝试现在也会试图锁定一个被破坏的互斥体——这是一场数据竞赛。
这是多线程环境中面向对象设计的基本限制。如果用户请求销毁一个对象,则由用户确保从那时起没有人会试图同时访问该对象。
请注意,在此上下文中,用户可以是任何外部实体。例如,在C++11中,您可以经常使用weak_ptr
来解决这个问题。但原则上,这仍然是一个非常重要的问题,需要仔细考虑。
相关文章:
- 什么时候在C++中返回常量引用是个好主意
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 我想访问std::unique_ptr中的一个特定元素
- 我想做一个彼此不同但重复出现的数字
- 我想知道长双倍和双倍之间的区别
- 如何设置一个范围来提取我想要获得的信息
- C++.我想将更改后的特定字符行保存在字符串中
- 我是 C++ 的初学者,我想知道如何在 2D 矢量中获取重复值
- 我是 c++ 的新手.学习基本知识后,我想做井字游戏.对于印刷板,我在下面写代码,但它显示错误
- 我想通过带有C++和Python的插件创建一个可扩展的应用程序
- 如果我想在没有更新编译器的情况下使用新功能,该怎么办?
- 我想在C++中读取一些多个字符,但它永远不会读取第二个字符
- 链接列表运算符重载没有打印出我想要的内容
- 我想生成许多矩阵并用随机数填充它
- 对于我想要的东西,有更好的API吗
- 我想把我的代码从CPP改成CUDA,好吗
- 如果我将所有函数都作为类的静态方法,这是一个好主意
- 包含.cpp文件而不是 .h 文件以使原版 gcc 能够进一步优化我的代码是个好主意
- 将pthread_mutex_t obj嵌入到C++obj实例中是个好主意吗?我想(遗憾的是)没有蝙蝠
- 我想不出一个好的算法