如果我了解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>来从多个线程访问简单类型更方便,并且也许更有效。

10-04 14:47