互斥锁和重分配
C++: Mutex and deallocation
我正在写一个小程序作为大学课程的一部分。在这个程序中,我有一个全局Boost互斥,它可以帮助我协调两个线程。
在我的小库中,我必须编写一个清理函数,当调用它时,它实际上是在清理自己。
我现在要问的是:如果我创建了一个互斥锁,当我不再需要它时,我应该释放它吗?
我使用的代码只是
boost::mutex mymutex;
Thanks to lot
Boost互斥似乎被写为在析构函数中执行所有的清理操作。如果你想为重用准备好同一个互斥锁,你可能想对它调用一次.unlock()
。
如果你真的觉得需要手动删除它,我想你可以把它变成一个指针,用new
创建它。这样,您就可以在清除例程中通过调用指针上的delete
来手动控制其析构函数的运行。然而,指针很容易出错,所以使用指针只是为了显示它被手动清理(而不是在程序结束时对象超出作用域时自动发生)是愚蠢的。如果你因为没有这样做而被扣了几分,我认为这是为正确设计而付出的小代价。
如果你真的担心因为没有手动清理自动销毁的资源而失分,如果我是你,我会去问我的教练我需要做什么。学校不是免费的(不像SO),这种咨询是你付给他们所有钱的一部分。不妨给它一些价值
当超出大括号定义的作用域时,它将被释放。
没有。c++中的对象在它们自己之后进行清理。只有在使用new
动态分配互斥锁时才需要清理互斥锁。
在清理函数中,您可能需要调用boost::mutex
对象的release/reset方法,以确保您不会将其留在有信号的状态。
@Danilo:我很确定这门课不需要你使用boost,老师希望你直接使用pthreads API。
在这种情况下,您需要调用pthread_mutex_init
和pthread_mutex_destroy
, boost会自动为您执行
当您定义一个对象(而不是指针)时,例如——
boost::mutex mymutex;
——c++将在对象超出作用域时调用对象的析构函数。
你现在需要做的是检查boost::mutex的文档,当它被d'tor调用时,它会做什么。但是,可以非常肯定的是,boost中的任何类都将在其博士中清理其资源(毕竟,这就是博士的作用)。如果不检查文档,您就不知道互斥锁的行为是什么。它的lock()函数是在医生被调用的时候。
因为你有一个全局对象,它的dr将在main()返回后被调用,就资源分配而言,这应该是好的。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- GlobalAlloc而不是其他分配方法
- 自定义先决条件对移动分配运算符有效吗
- 我可以重新分配/覆盖std::字符串吗
- 在c++中使用动态分配的问题
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- 为什么我可以使用比分配的内存更多的内存
- 使用RAII在给定次数的迭代后重新分配资源