【问题标题】:Clang thread safety analysis with C++ standard library使用 C++ 标准库进行 Clang 线程安全分析
【发布时间】:2015-08-01 15:07:36
【问题描述】:

这描述了如何使用 C++ 中的注释进行静态线程安全分析:http://clang.llvm.org/docs/ThreadSafetyAnalysis.html

如何将它与 std::mutex 和 std::lock_guard 等标准类型一起使用?

mutex.h 的示例代码注释了一个自定义接口。我是否有在那里定义的类型“Mutex”并使用带有注释方法的 std::mutex 实现一个类,或者 Clang 是否以某种方式带来了注释类型?

【问题讨论】:

  • 我不明白你为什么不能使用标准类型。找出答案的最好方法是编译一个小样本,看看会发生什么。
  • 它会打印一条警告,说我想使用 std::mutex 需要这些功能或其他东西。
  • 也许它使用了来自 GCC 而不是 Clang 的错误标准库?
  • 我不明白为什么它会与 <mutex> 一起使用,除非你标记它。您还必须标记unique_lock 等。

标签: c++ multithreading c++11 clang


【解决方案1】:

在最新版本的 clang 中,您可能不再需要包装 std::mutex,因为线程安全注释是 included since March 15, 2016

这为 std::mutex 和 std::lock_guard 所以使用这些类型的代码可以直接使用这些类型 而不必包装类型来提供注释。这些检查 当由 -Wthread-safety 启用时,提供简单但有用的静态 检查以检测潜在的竞争条件。

详情请见http://clang.llvm.org/docs/ThreadSafetyAnalysis.html

所以只需拥有-Wthread-safety 就足够了。

【讨论】:

  • 这仅适用于libc++。对于其他实现,例如libstdc++,一种直接而暴力的方法是添加一个类包装器。可以在documentation 中找到一个示例。
【解决方案2】:

实现提供的 mutex.h 文件中描述的接口,并使用 std::mutex 类来执行此操作。即这里是一个半完成的实现:

mutex.h 文件的小改动以包含 std::mutex 对象

class CAPABILITY("mutex") Mutex {
private:
  std::mutex std_mutex;
public:
  // Acquire/lock this mutex exclusively.  Only one thread can have exclusive
  // access at any one time.  Write operations to guarded data require an
  // exclusive lock.

然后在 mutex.cpp 中实现其余部分

#include "mutex.h"

void Mutex::Lock(){
  this->std_mutex.lock();
}

void Mutex::Unlock(){
  this->std_mutex.unlock();
}

bool Mutex::TryLock(){
  return this->std_mutex.try_lock();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 2019-10-01
    • 2013-08-23
    相关资源
    最近更新 更多