【发布时间】: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