返回对象值时的互斥 < >如果我理解C++编译器如何处理本地变量,那么 ISStutDeNoPieldStices()/Cuth.>不需要任何锁定,因为 StudioLeunPosie静态变量将被放置在堆栈上。我说得对吗 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; } }

返回对象值时的互斥 < >如果我理解C++编译器如何处理本地变量,那么 ISStutDeNoPieldStices()/Cuth.>不需要任何锁定,因为 StudioLeunPosie静态变量将被放置在堆栈上。我说得对吗 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; } },c++,multithreading,pthreads,mutex,C++,Multithreading,Pthreads,Mutex,是的,它需要一把锁 C++11的内存模型表明,如果任何线程在另一个线程读取某个值的同时写入该值,则存在数据竞争。这是因为读和/或写可能都不是原子的 在这种情况下,您将从函数返回一个本地值,但要获得该本地值,编译器需要复制shutdownInProgress中的值,该值可能会被另一个调用shutdownisprogress()的线程同时更改 解决此问题的一个简单方法是将shutdownInProgress设置为原子: static std::atomic<bool> shutdownI

是的,它需要一把锁

C++11的内存模型表明,如果任何线程在另一个线程读取某个值的同时写入该值,则存在数据竞争。这是因为读和/或写可能都不是原子的

在这种情况下,您将从函数返回一个本地值,但要获得该本地值,编译器需要复制
shutdownInProgress
中的值,该值可能会被另一个调用
shutdownisprogress()
的线程同时更改

解决此问题的一个简单方法是将
shutdownInProgress
设置为原子:

static std::atomic<bool> shutdownInProgress;
静态std::原子关机程序;
如果使其原子化,则两个函数都不需要任何锁

我说得对吗

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::Ac原子< /C> >以方便、更有效地访问多个线程中的简单类型。

竞争条件与变量位于堆上或堆栈上无关。争用条件是一个线程正在修改一个变量(内存位置),而另一个线程正在读取或修改同一个变量。不能保证对

bool
的修改是原子的,因此发布的代码具有竞争条件,因此行为未定义

修复方法是在保持互斥锁时存储
bool
的值并返回变量:

static bool IsShutdownInProgress()
{
    pthread_mutex_lock(&mutex);
    bool result = shutdownInProgress;
    pthread_mutex_unlock(&mutex);
    return result;
}
引入了c++11,可以使用它,使用
lock\u guard
可以避免使用临时变量来存储
bool
返回值:

static std::mutex mtx_;
static bool IsShutdownInProgress()
{
    std::lock_guard<std::mutex> lk(mtx_);
    return shutdownInProgress;
}
static std::mutex mtx;
静态布尔IsShutdownInProgress()
{
标准:锁紧保护lk(mtx);
返回关机程序;
}
还引入了c++11,以确保修改是原子的,并避免需要显式锁:

static std::atomic<bool> shutdownInProgress;
static bool IsShutdownInProgress()
{
    return shutdownInProgress;
}
静态std::原子关机程序;
静态布尔IsShutdownInProgress()
{
返回关机程序;
}
如果c++11不可用,则在v1.53.0中引入了,boost也具有同等功能