c++中带有std::Vector的多线程

MultiThreading with std::Vector in C++

本文关键字:Vector 多线程 std c++      更新时间:2023-10-16

我想创建两个并发访问vector的线程,这样一个线程每隔10毫秒将元素推到vector的后面,另一个线程只是监视vector,看看它的大小是否发生了变化。在这里,我得到错误"解锁无主互斥锁",你能告诉我为什么吗?

class SafeVec
{
public:
    SafeVec(){}
    ~SafeVec(){}
    void safePushBack(int val)
    {
        vecMutex.lock();
        vec.push_back(val);
        vecMutex.unlock();
    }
    size_t safeGetSize()
    {
        vecMutex.lock();
        size_t size = vec.size();
        vecMutex.unlock();
        return size;
    }
private:
    std::vector<int> vec;
    std::mutex vecMutex;
};
class safeStream
{
public:
    safeStream(){}
    ~safeStream(){}
    void Test()
    {
        std::thread t(&safeStream::tMonitorVec, this); // spawned a new thread
        for (size_t i = 0; i < 100; i++)
        {
            myVec.safePushBack(1);
            Sleep(10);
        }
        stopMonitoringMutex.lock();
        stopMonitoring = true;
        stopMonitoringMutex.unlock();
    }
private:
    void tMonitorVec()
    {
        stopMonitoring = false;
        size_t tempSize = myVec.safeGetSize();
        int count = 0;
        stopMonitoringMutex.lock();
        while (1)
        {
            if (stopMonitoring)
            {
                stopMonitoringMutex.unlock();
                break;
            }
            else
            {
                stopMonitoringMutex.unlock();
                if (tempSize != myVec.safeGetSize())
                {
                    count++;
                }
            }
        }
        std::cout << count;
    }
    SafeVec myVec;
    bool stopMonitoring;
    std::mutex stopMonitoringMutex;
};
int main()
{
    safeStream myStream;
    myStream.Test();
    return 0;
}

这发生在你的循环中:

while (1)
{
    if (stopMonitoring)
    {
        stopMonitoringMutex.unlock();
        break;
    }
    else
    {
        // Whoops! I am here again !
        stopMonitoringMutex.unlock();
        if (tempSize != myVec.safeGetSize())
        {
            count++;
        }
    }
}

还有一件事要考虑:如果您使用std::mutex只是为了保护对字段bool stopMonitoring;的并发访问,请使用std::atomic<bool> stopMonitoring;来代替,并忘记互斥。