gpt4 book ai didi

c++ - 将 pthread_mutex_t obj 嵌入到 C++ obj 实例中是个好主意吗?我认为(可悲的)没有 bat

转载 作者:搜寻专家 更新时间:2023-10-31 01:42:35 26 4
gpt4 key购买 nike

这个问题源于我通过 pthread 实现以下简单邮箱接口(interface)的努力:

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 对象上同时调用DeleteMailBoxTxMailBox。正如您所观察到的,MailBox 对象本身无法防止这种竞争。即使您可以销毁锁定的互斥体,另一个线程的并发锁定尝试现在也会尝试锁定已销毁的互斥体,这是一种数据竞争。

这是多线程上下文中面向对象设计的基本限制。如果用户请求销毁某个对象,则由用户负责确保从那时起没有人会尝试并发访问该对象。

请注意,此上下文中的用户 可以是任何外部实体。例如,在 C++11 中,您通常可以使用 weak_ptr 来解决这个问题。但原则上,这仍然是一个非常重要的问题,需要仔细考虑。

关于c++ - 将 pthread_mutex_t obj 嵌入到 C++ obj 实例中是个好主意吗?我认为(可悲的)没有 bat ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613351/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com