如果我了解C++编译器如何处理局部变量,则IsShutdownInProgress()
不需要任何锁定,因为shutdownInProgress
静态变量将放置在堆栈中。我对么?
class MyClass
{
private:
// Irrelevant code commented away
static pthread_mutex_t mutex;
static bool shutdownInProgress;
public:
static void ShutdownIsInProgress()
{
pthread_mutex_lock(mutex);
shutdownInProgress = true;
pthread_mutex_unlock(mutex);
}
static bool IsShutdownInProgress()
{
// pthread_mutex_lock(mutex);
// pthread_mutex_unlock(mutex);
return shutdownInProgress;
}
}
最佳答案
不会。这将使它的拷贝返回;但是读取它以使该拷贝不同步将导致数据争用,并且行为不确定。您需要在锁定了互斥锁的情况下对其进行本地复制:
static bool IsShutdownInProgress()
{
pthread_mutex_lock(mutex);
bool result = shutdownInProgress;
pthread_mutex_unlock(mutex);
return result;
}
或者,使用不太容易出错的RAII锁定类型:
static bool IsShutdownInProgress()
{
lock_guard lock(mutex);
return shutdownInProgress;
}
在C++ 11中,您可以考虑使用
std::atomic<bool>
来从多个线程访问简单类型更方便,并且也许更有效。