Multithreading – clang thread safety annotations and sharing capabilities
•
Java
When I use clang thread annotations, the following code generates a warning I'm trying to wrap boost:: shared_ Mutex and boost:: shared_ lock. How do I use thread annotations to indicate that this lock is a shared lock?
Source code:
#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);
}
Sonorous output:
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.
Editor: this compilation, but it seems wrong Is that my problem?
#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?
}
Solution
This seems to work after trying several combinations:
#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;
}
}
I wonder why mutexsharedlock should use acquire_ shared_ Capability but release_ capability …
(if anyone can confirm that the code is correct, I will open this problem)
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码
