Clang负线程安全能力注解编译报错问题求助
问题解决:Clang负线程安全能力
REQUIRES(!mu)语法错误 错误原因
直接对std::mutex对象使用!操作符(REQUIRES(!mu))属于语法错误——std::mutex没有重载一元!运算符,Clang的负线程安全能力是针对锁的持有状态谓词,而非锁对象本身。
正确实现步骤
1. 给std::mutex添加线程安全能力注解
Clang默认不识别std::mutex为线程安全锁,需要先通过注解标记它具备mutex能力:
#include <mutex> // 用Clang属性标记std::mutex为线程安全锁 using Mutex = std::mutex __attribute__((capability("mutex")));
如果使用Clang提供的线程安全宏(需包含对应头文件),代码更简洁:
#include <mutex> #include <clang/ThreadSafetyAnalysis.h> // CAPABILITY宏等价于__attribute__((capability)) using Mutex = std::mutex CAPABILITY("mutex");
2. 使用正确的负能力语法
负能力需要针对locked(mu)这个表示锁被持有的谓词取反,写法为REQUIRES(!locked(mu)):
class Foo { Mutex mu; public: // 正确:要求mu未被持有 void bif() REQUIRES(!locked(mu)); void bar() { mu.lock(); bif(); // 编译器会触发警告:当前持有mu,违反bif的!locked(mu)要求 mu.unlock(); } }; void Foo::bif() REQUIRES(!locked(mu)) { // 此处mu未被持有,符合要求 }
3. 编译选项
编译时需启用线程安全分析和负能力检查:
clang++ -std=c++17 -Wthread-safety -Wthread-safety-negative your_code.cpp
关键说明
locked(mu)是Clang线程安全分析内置的谓词,用来表示mu处于被持有状态,!locked(mu)则表示锁未被持有。- 必须先给
std::mutex添加capability注解,否则Clang无法识别它为线程安全锁,也无法解析locked(mu)谓词。
内容的提问来源于stack exchange,提问作者CoffeeTableEspresso
相关产品推荐
相关产品推荐

