【问题标题】:C++: Mutex and deallocationC++:互斥和释放
【发布时间】:2011-05-03 13:07:11
【问题描述】:

我正在编写一个小程序作为大学课程的一部分。在这个程序中,我有一个全局 Boost Mutex,它可以帮助我协调两个线程。

在我的小型库中,我必须编写一个清理函数,当调用该函数时,它会自行清理。

我现在要问的是:如果我创建了一个 Mutex,我是否应该在不再需要它时也将其释放?

我使用的代码很简单

boost::mutex mymutex;

非常感谢

【问题讨论】:

  • 为了更清楚一点:练习的具体内容是“清理功能必须释放所有资源”。

标签: c++ boost mutex boost-thread


【解决方案1】:

Boost 互斥锁似乎被编写为在其析构函数中执行所有清理工作。如果您想准备好相同的互斥锁以供重用,您可能需要调用一次.unlock()

如果您真的觉得需要手动摆脱它,我想您可以将其设为指针并使用new 创建它。这样,您可以通过在指针上调用 delete 来手动控制其析构函数在清理例程中的运行。然而,指针有点容易出错,所以使用指针只是为了显示它被手动清理(而不是在程序结束时对象超出范围时自动发生)是 stoopid。如果您因为不这样做而被扣分,我会认为为正确设计事物付出的代价很小。

如果你真的担心因为不手动清理自动销毁的资源而失去积分,如果我是你我会去问我的导师我需要做什么。学校不是免费的(不像 SO),而这样的咨询是你付给他们所有钱的一部分。还不如从中获得一些价值。

【讨论】:

  • 嘿。没有什么比接受 0 分答案更让我开心的了。 :-)
  • 让记录显示这个答案花了 6.5 年才得到一个支持。
【解决方案2】:

当超出花括号定义的范围时,它将被释放。您应该小心解锁互斥锁。

【讨论】:

    【解决方案3】:

    不。 C++ 中的对象会自行清理。如果您使用 new 动态分配了互斥锁,则只需清理它。

    【讨论】:

    • ...仅当他们被写入这样做时。但是,Boost 对象(包括互斥体)通常是为此而编写的。
    【解决方案4】:

    在清理函数中,您可能需要调用 boost::mutex 对象的释放/重置方法,以确保您不会将其置于信号状态。

    【讨论】:

      【解决方案5】:

      @Danilo:我很确定这门课程不需要你使用 boost,老师希望你直接使用 pthreads API。

      在这种情况下,您需要调用 pthread_mutex_initpthread_mutex_destroy,boost 会自动为您服务

      【讨论】:

      • 我不太确定你是如何推断出 OP 正在学习的课程以及老师的期望,但如果是这样的话,为了异常安全,你真的应该将 pthreads API 包装在RAII 类(就像boost::mutex 一样)。如果它没有教你安全地编写 C++,那将是一门非常糟糕的课程。
      【解决方案6】:

      当你定义一个对象(而不是指针)时,比如在 --

      boost::mutex mymutex;
      

      -- 当对象超出范围时,C++ 将调用对象的析构函数。

      您现在需要做的是 check the documentation of boost::mutex 了解调用 d'tor 时它会做什么。但是,您可以非常确定 boost 中的任何类都会清理其 dtor 中的资源(毕竟这就是 dtor 的用途)。如果不检查文档,您不知道 Mutex 的行为是什么。它的 lock() 函数是在调用 dtor 时。

      因为你有一个全局对象,它的 dtor 将在 main() 返回后被调用,就资源释放而言应该没问题。

      【讨论】:

        猜你喜欢
        • 2013-06-08
        • 1970-01-01
        • 2011-03-17
        • 2010-12-25
        • 2012-02-23
        • 1970-01-01
        • 2013-06-06
        • 2011-05-08
        • 2023-02-07
        相关资源
        最近更新 更多