互斥锁和重分配

C++: Mutex and deallocation

本文关键字:分配      更新时间:2023-10-16

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

在我的小库中,我必须编写一个清理函数,当调用它时,它实际上是在清理自己。

我现在要问的是:如果我创建了一个互斥锁,当我不再需要它时,我应该释放它吗?

我使用的代码只是

boost::mutex mymutex;

Thanks to lot

Boost互斥似乎被写为在析构函数中执行所有的清理操作。如果你想为重用准备好同一个互斥锁,你可能想对它调用一次.unlock()

如果你真的觉得需要手动删除它,我想你可以把它变成一个指针,用new创建它。这样,您就可以在清除例程中通过调用指针上的delete来手动控制其析构函数的运行。然而,指针很容易出错,所以使用指针只是为了显示它被手动清理(而不是在程序结束时对象超出作用域时自动发生)是愚蠢的。如果你因为没有这样做而被扣了几分,我认为这是为正确设计而付出的小代价。

如果你真的担心因为没有手动清理自动销毁的资源而失分,如果我是你,我会去问我的教练我需要做什么。学校不是免费的(不像SO),这种咨询是你付给他们所有钱的一部分。不妨给它一些价值

当超出大括号定义的作用域时,它将被释放。

没有。c++中的对象在它们自己之后进行清理。只有在使用new动态分配互斥锁时才需要清理互斥锁。

在清理函数中,您可能需要调用boost::mutex对象的release/reset方法,以确保您不会将其留在有信号的状态。

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

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

当您定义一个对象(而不是指针)时,例如——

boost::mutex mymutex;

——c++将在对象超出作用域时调用对象的析构函数。

你现在需要做的是检查boost::mutex的文档,当它被d'tor调用时,它会做什么。但是,可以非常肯定的是,boost中的任何类都将在其博士中清理其资源(毕竟,这就是博士的作用)。如果不检查文档,您就不知道互斥锁的行为是什么。它的lock()函数是在医生被调用的时候。

因为你有一个全局对象,它的dr将在main()返回后被调用,就资源分配而言,这应该是好的。