带有 std::condition 变量的 Clang 线程安全
Clang thread safety with std::condition variable
我在 clang 线程安全模型之后实现了以下互斥锁 类(希望如此)。 (http://clang.llvm.org/docs/ThreadSafetyAnalysis.html)
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()
{
}
};
用法如下:
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_; } );
}
}
};
我收到 clang 警告:
warning: reading variable 'count_' requires holding mutex 'mutex_' [-Wthread-safety-analysis]
.
编译器的警告(带-Wthread-safety 的clang 3.8)是否正确?如果是,违规具体是如何发生的?
这段代码问题很大。您正在继承 unique_lock
,但您没有正确构建它!您有自己的互斥锁,您 lock/unlock,但 unique_lock
拥有的互斥锁将保持未初始化状态。条件变量 wait_for
将在父锁上调用 release
,并将释放未锁定的互斥量,使互斥量保持锁定状态。
我看不出有任何理由参与在您的自定义中重新实现锁定的练习 类。请记住,标准库 类 几乎 从未 打算继承自。
因为编译器不清楚lambda表达式在哪里求值,所以也需要对lambda进行注解。
没有产生任何错误的正确行是
return cv_.wait_for( lock, duration, [this]() REQUIRES( mutex_ ) { return count_ >= min_count_; } );
我在 clang 线程安全模型之后实现了以下互斥锁 类(希望如此)。 (http://clang.llvm.org/docs/ThreadSafetyAnalysis.html)
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()
{
}
};
用法如下:
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_; } );
}
}
};
我收到 clang 警告:
warning: reading variable 'count_' requires holding mutex 'mutex_' [-Wthread-safety-analysis]
.
编译器的警告(带-Wthread-safety 的clang 3.8)是否正确?如果是,违规具体是如何发生的?
这段代码问题很大。您正在继承 unique_lock
,但您没有正确构建它!您有自己的互斥锁,您 lock/unlock,但 unique_lock
拥有的互斥锁将保持未初始化状态。条件变量 wait_for
将在父锁上调用 release
,并将释放未锁定的互斥量,使互斥量保持锁定状态。
我看不出有任何理由参与在您的自定义中重新实现锁定的练习 类。请记住,标准库 类 几乎 从未 打算继承自。
因为编译器不清楚lambda表达式在哪里求值,所以也需要对lambda进行注解。
没有产生任何错误的正确行是
return cv_.wait_for( lock, duration, [this]() REQUIRES( mutex_ ) { return count_ >= min_count_; } );