clangスレッドセーフティモデルの後に、以下のミューテックスクラス(うまくいけば)を実装しました。以下の(http://clang.llvm.org/docs/ThreadSafetyAnalysis.html)std :: condition変数を使用したスレッド安全性
class CAPABILITY("mutex") Mutex : public std::mutex
{
public:
void lock() ACQUIRE()
{
std::mutex::lock();
}
void unlock() RELEASE()
{
std::mutex::unlock();
}
};
class SCOPED_CAPABILITY LockGuard : public std::unique_lock<std::mutex>
{
public:
LockGuard(Mutex& mu) ACQUIRE(mu) : std::unique_lock<std::mutex>(mu)
{
}
~LockGuard() RELEASE()
{
}
};
利用がされて: warning: reading variable 'count_' requires holding mutex 'mutex_' [-Wthread-safety-analysis]
:
class Barrier
{
...
Mutex mutex_;
std::condition_variable cv_ GUARDED_BY(mutex_);
std::size_t min_count_ GUARDED_BY(mutex_);
std::size_t count_ GUARDED_BY(mutex_);
bool Barrier::waitFor(const std::chrono::microseconds& duration)
{
LockGuard lock(mutex_);
if (count_ >= min_count_)
{
return true;
}
else
{
// WARNING IS IN THE LINE BELOW
return cv_.wait_for(lock, duration, [this]() { return count_ >= min_count_; });
}
}
};
は私が打ち鳴らす警告が表示されます。
コンパイラ(-Wthread-safetyのclang 3.8)の警告は正しいですか?はいの場合、違反はどのくらい正確に起こりますか?
です。しかし、clangだけが独自のlibの中でこの機能を提供しています。したがって、独自のコードで再実装する必要があります。 – Trevir
あなたはほとんどすべてを再実装する必要があります。あなたはそれをあなたがしたように継承することはできません。 – SergeyA
私はそれに応じてコードを変更しましたが、警告は変わりません。なぜ継承が適切ではないのかをもっと詳しく説明してください。 – Trevir