【问题标题】:Using Clang Thread Safety Analysis with shared_ptr使用带有 shared_ptr 的 Clang 线程安全分析
【发布时间】:2018-12-05 01:16:27
【问题描述】:

我正在研究 Clang 7.0 的 Clang Thread Safety Analysis 功能

但是,当我尝试将 PT_GUARDED_BY 注释与 shared_ptr 数据成员一起使用时出现错误:

错误:“pt_guarded_by”仅适用于指针类型;这里的类型是 'shared_ptr' [-Werror,-Wthread-safety-attributes]

这让我有点困惑,因为文档说“PT_GUARDED_BY 是......旨在用于指针和智能指针。”,甚至给出了一个使用 std::unique_ptr 的示例(使用与我基本相同的语法正在使用)。

std::shared_ptr 与 Clang 的线程安全分析不兼容,还是这里发生了其他事情?如果没有对关联的互斥锁进行锁定,我应该如何说明不应该访问指向的类?

(如果重要,这是在使用 GCC 的 libstdc++ 标准库的 Linux 上。)


经过一些实验,看起来只有当 shared_ptr 是成员变量而不是全局变量时才会发生这种情况。

#include "mutex.h" // The suggested mutex.h file from the Clang Thread Safety Analysis page
#include <memory>

Mutex mu;

std::shared_ptr< int > toplevel PT_GUARDED_BY(mu); // Okay

class Wrapper {
public:
  std::shared_ptr< int > member PT_GUARDED_BY(mu); // Results in error
};

void test() {
  Wrapper wrapped;
  wrapped.member = std::shared_ptr< int >( new int ); // Should be OK
  *wrapped.member = 42; // Should raise warning
}

我会注意到,如果我将 unique_ptr 换成 shared_ptr,则全局变量和成员变量都可以正常工作。

【问题讨论】:

  • @ShafikYaghmour 不是很相关,除了表面上的“两者都是关于 shared_ptr 和线程”级别。我的问题与 shared_ptr 的效率无关,甚至与 shared_ptr 类的内在线程安全保证无关。相反,它是关于使用 shared_ptr 和特定的静态分析工具(恰好是检查线程安全问题)。
  • 阅读文档,它确实应该有效。但是我确实知道 libc++ 有与其工具相关的额外注释。你试过那个吗?

标签: c++ thread-safety clang shared-ptr


【解决方案1】:

在尝试了各种 Clang 编译和不同的 C++ 标准库之后,我想我已经弄清楚了。

当与(GCC 的)libstdc++ 结合使用时,这是 Clang 7.0.0 中的一个错误。

如果您使用当前(2018 年 12 月 4 日)主干 Clang(那么最终会变成 8.0.0),那么(GCC 的)libstdc++ 和(Clang 的)libc++ 都可以正常工作。

如果您使用 Clang 7.0.0,则(Clang 主干的)libc++ 可以正常工作,但如果您将它与(GCC 的)libstdc++ 一起使用,则会引发上述错误……至少对于 GCC 4.8 - GCC 6.2 中的 libstdc++范围(这是我手头要测试的。)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 2013-01-07
    • 2019-06-07
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多