多线程 – Clang线程安全注释和共享功能
发布时间:2020-12-15 02:11:11 所属栏目:Java 来源:网络整理
导读:当我使用clang thread annotations时,以下代码生成一个警告.我正在尝试包装boost :: shared_mutex和boost :: shared_lock.如何使用线程注释表示此锁是一个共享锁? 源代码: #include mutex#include "boost/thread/shared_mutex.hpp"class __attribute__((sh
当我使用clang
thread annotations时,以下代码生成一个警告.我正在尝试包装boost :: shared_mutex和boost :: shared_lock.如何使用线程注释表示此锁是一个共享锁?
源代码: #include <mutex> #include "boost/thread/shared_mutex.hpp" class __attribute__((shared_capability("mutex"))) BoostSharedMutex { public: boost::shared_mutex &getNativeHandle() { return m_mutex; } private: mutable boost::shared_mutex m_mutex; }; class __attribute__((scoped_lockable)) MutexSharedLock { public: explicit MutexSharedLock(BoostSharedMutex &mutex) __attribute__((acquire_shared_capability(mutex))) : m_lock(mutex.getNativeHandle()) {} ~MutexSharedLock() __attribute__((release_shared_capability())) = default; private: boost::shared_lock<boost::shared_mutex> m_lock; }; int main() { BoostSharedMutex mutex; MutexSharedLock lock(mutex); } 铿锵输出: clang++-3.6 --std=c++11 -Wall -Wthread-safety /tmp/foo.cpp -lboost_system /tmp/foo.cpp:25:5: warning: releasing mutex 'lock' using shared access,expected exclusive access [-Wthread-safety-analysis] } ^ 1 warning generated. 编辑:这编译但似乎错了.这是我的问题吗? #include <mutex> #include "boost/thread/shared_mutex.hpp" class __attribute__((shared_capability("mutex"))) BoostSharedMutex { public: boost::shared_mutex &getNativeHandle() { return m_mutex; } private: mutable boost::shared_mutex m_mutex; }; class __attribute__((scoped_lockable)) MutexSharedLock { public: explicit MutexSharedLock(BoostSharedMutex &mutex) __attribute__((acquire_capability(mutex))) // changed from acquired_shared_capability : m_lock(mutex.getNativeHandle()) {} ~MutexSharedLock() __attribute__((release_capability())) = default; // changed from release_shared_capability private: boost::shared_lock<boost::shared_mutex> m_lock; }; BoostSharedMutex mutex; int locked_variable __attribute__((guarded_by(mutex))); int main() { MutexSharedLock lock(mutex); std::cout << locked_variable << std::endl; // ok,guarded variable is only read locked_variable = 42; // no warning while writing in the guarded variable while only holding a non-exclusive lock? } 解决方法
尝试几种组合后,这似乎有效:
#include <mutex> #include "boost/thread/shared_mutex.hpp" class __attribute__((capability("mutex"))) BoostSharedMutex { public: boost::shared_mutex &getNativeHandle() { return m_mutex; } private: mutable boost::shared_mutex m_mutex; }; class __attribute__((scoped_lockable)) MutexSharedLock { public: explicit MutexSharedLock(BoostSharedMutex &mutex) __attribute__((acquire_shared_capability(mutex))) : m_lock(mutex.getNativeHandle()) {} ~MutexSharedLock() __attribute__((release_capability())) = default; private: boost::shared_lock<boost::shared_mutex> m_lock; }; class __attribute__((scoped_lockable)) MutexLock { public: explicit MutexLock(BoostSharedMutex &mutex) __attribute__((acquire_capability(mutex))) : m_lock(mutex.getNativeHandle()) {} ~MutexLock() __attribute__((release_capability())) = default; private: std::unique_lock<boost::shared_mutex> m_lock; }; BoostSharedMutex mutex; int locked_variable __attribute__((guarded_by(mutex))); int main() { { MutexSharedLock lock(mutex); std::cout << locked_variable << std::endl; // locked_variable = 42; -- triger a error as expected } { MutexLock lock(mutex); std::cout << locked_variable << std::endl; locked_variable = 42; } } 我很想知道为什么MutexSharedLock应该使用acquire_shared_capability但释放release_capability … (如果任何人都可以确认代码是正确的,我会打开这个问题) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容