Я смотрю на Анализ безопасности потока Clang с Clang 7.0
Однако при попытке использовать аннотацию PT_GUARDED_BY с данными shared_ptr
я получаю сообщение об ошибкечлены:
ошибка: 'pt_guarded_by' применяется только к типам указателей;введите здесь 'shared_ptr ' [-Werror, -Wthread-safety-attribute]
Это немного сбивает с толку меня, так как документация гласит: "PT_GUARDED_BY ... предназначен для использования"на указатели и умные указатели. ", и даже приводит пример, который использует std :: unique_ptr (используя в основном тот же синтаксис, который я использую).
Является ли std :: shared_ptr несовместимым с анализом безопасности потоков Clang, илиздесь что-то еще происходит?Как мне следует заявить, что к указанному классу нельзя обращаться без удержания блокировки на связанном мьютексе?
(Это в Linux, используя стандартную библиотеку GCC libstdc ++, если это имеет значение.)
После некоторых экспериментов похоже, что это происходит только в том случае, если 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
, то глобальная переменная и переменная-член будут работать нормально.