gpt4 book ai didi

c++ - 如何在 C++11 中处理互斥成员函数

转载 作者:行者123 更新时间:2023-11-30 00:55:10 26 4
gpt4 key购买 nike

这主要是一个设计问题,但由于我使用 C++11 编程,所以我更喜欢使用 C++11 的解决方案/建议。

基本上问题是我想让我的类易于维护同时避免使用过度锁定。

问题很简单:

我可以避免在 private 类函数 a 的开头加锁,如果它只被 public 类函数 b 在它开始时锁定了类互斥锁。维护 hell 是将来不容易看到什么方法正在调用什么,并且有可能有人会公开 b 并使类线程不安全。

那么最优解是什么:

  • 注释 b 表示它不锁定 std::mutex 因为它只被 a
  • 调用
  • 使用recursive_mutex 并锁定每个方法:看起来很浪费
  • 别的

最佳答案

there is a chance that somebody will just make b public

您不必为此担心。如果有人在不了解后果或如何正确使用该功能的情况下将私有(private)实现细节变成公共(public)成员,那么您已经遇到了维护噩梦。您是否还担心他们会公开您的所有数据成员?担心这些事情似乎是在浪费时间。如果不是很明显该函数不打算公开,则重命名它并添加明确的注释。

然而……

经常使用的一种替代方法是要求将锁定对象传递给函数,这样在不锁定互斥锁的情况下更难调用它,无论该锁定是由另一个成员函数还是任何其他类完成的:

class X
{
public:
void frobnicate()
{
std::unique_lock<std::mutex> lock(this->mutex);
frob_impl(lock);
}

private:
void frob_impl(const std::unique_lock<std::mutex>&)
{
// do it
}

std::mutex mutex;
};

如果你想对人们更改代码做愚蠢的事情真的很偏执,你可以添加一个检查以确保正确的互斥锁被锁定:

    void frob_impl(const std::unique_lock<std::mutex>& lock)
{
assert( &this->mutex == lock.mutex() );
// do it
}

但是,如果您不信任后来的维护程序员,您怎么知道他们不会直接删除该检查?

关于c++ - 如何在 C++11 中处理互斥成员函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12878201/

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