- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
这个问题源于我通过 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
对象上同时调用DeleteMailBox
和TxMailBox
。正如您所观察到的,MailBox
对象本身无法防止这种竞争。即使您可以销毁锁定的互斥体,另一个线程的并发锁定尝试现在也会尝试锁定已销毁的互斥体,这是一种数据竞争。
这是多线程上下文中面向对象设计的基本限制。如果用户请求销毁某个对象,则由用户负责确保从那时起没有人会尝试并发访问该对象。
请注意,此上下文中的用户 可以是任何外部实体。例如,在 C++11 中,您通常可以使用 weak_ptr
来解决这个问题。但原则上,这仍然是一个非常重要的问题,需要仔细考虑。
关于c++ - 将 pthread_mutex_t obj 嵌入到 C++ obj 实例中是个好主意吗?我认为(可悲的)没有 bat ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26613351/
我在老虎上使用 xcode 2.4.1。当我在下面做的时候一切正常。当我做 pthread_mutex_t mute; ImageMan() { dibSize=0; mute =
发件人:https://www.sourceware.org/pthreads-win32/manual/pthread_mutex_init.html Variables of type pthre
我有一个全局结构指针,我已经完成了一个 malloc (10 个结构的数组),并且我已将该结构的一个实例发送给每个线程,并且在将此结构实例作为参数传递给 pthread_create() 之前,正在更
我是并行计算的新手,所以我正在研究 pthread 和互斥量。运行以下代码会导致死锁。谁能解释我为什么,以及如何以正确的方式做到这一点?我的目的是保护成员变量不被交叉写入。非常感谢! #include
与this question相关--- 我正在调试一些两次解锁互斥锁的代码,我试图弄清楚它发生的确切时间。我从 Helgrind 获取堆栈跟踪,但我希望程序在执行错误解锁时立即崩溃。 我知道解锁一个已
有人可以解释一下在什么情况下使用 std::mutex 与 pthread_mutex_t 比较有益。我不明白为什么我们会使用 pthread_mutex_t。谢谢 最佳答案 pthread_mute
我已经声明了 pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在我的主程序 main.cpp 的全局空间中。 但是,每当我尝试在函数定义中引用它时,例
我想构建一个动态分配的 pthread_mutex 数组,它会随着时间的推移而增长(添加更多的互斥锁)。我的问题是,如果数组被 realloc() 移动,它们是否仍然有效。我担心的是 pthread_
我正在学习 C 中的并发性。我知道有几种方法可以初始化 pthread_mutex_t。 这个简单的程序运行良好: #include #include pthread_mutex_t lock =
在 java 中,我们通常将锁变量设为最终静态,这样它就只有一个副本存在(虽然我记得读过,即使是静态变量也可以复制到两个方法的调用堆栈中!) 但是我在处理C和数据的同步。我已经声明了一个 pthrea
可以将 pthread 锁传递给函数吗?我要求这个的原因是因为我有很多线程,比如说10个,充当消费者,还有2个生产者,每个消费者线程都有它自己的链表(缓冲区),生产者将数据发送到其中之一线程基于特定规
这个问题在这里已经有了答案: Undefined reference to static class member (9 个回答) C++ - Initialize and modify a sta
考虑下一段代码—— #include using namespace std; int sharedIndex = 10; pthread_mutex_t mutex; void* foo(void
问题:初始化的 pthread_mutex_t 对象是否内核持久化?-- 关注的是 Linux V 2.6 以后的版本。 动机:如果持久化:对象资源将不会随着特定的清理而释放,pthread_mute
我为打算在两个进程之间使用的 pthread_mutex_t 编写了一个 super 简单的包装器: //basic version just to test using it between two
我很确定这是一个天真的问题,但仍然会问这个问题,因为我在网上找不到太多帮助。我正在使用 pthreads 编写 C++ 代码。以下是其中一种方法的概述 void Method1() { try
我正在查看 pthreadtypes.h 文件中的 pthread_mutex_t 结构。 “__lock”代表什么?它就像分配给互斥锁的锁号吗? typedef union { struct _
确保堆栈分配的 pthread_mutex_t 对象在多线程环境中仅初始化一次的可取/标准方法是什么? pthread_mutex_init() 手册页说: Attempting to initial
在我的程序中,我有一个守护线程等待任务并将它们打印到文件中。它的作用是: void * deamon(void *) { while(true) { pthread_mutex
我测试了两个非常简单的在多线程代码中打印偶数/奇数的示例,一个使用 pthread_cond_t 而另一个不使用。 void *even(void *arg) { while(count h
我是一名优秀的程序员,十分优秀!