c++ - 在 C++ 中使用 std::Vector 进行多线程

标签 c++ multithreading c++11 thread-safety mutex

我想创建两个同时访问一个 vector 的线程,这样一个线程每 10 毫秒不断将元素推送到 vector 后面,另一个只是监视 vector 以查看其大小是否发生了变化。在这里,我收到错误“unlock of unowned mutex”,你能告诉我原因吗。

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;相反,忘掉互斥体吧。

关于c++ - 在 C++ 中使用 std::Vector 进行多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25491013/

相关文章:

c++ - 哪个先执行,RAII还是函数返回值

c++ - 默认情况下是否创建 move 构造函数?

c++ - static constexpr 成员的统一初始化

C++ 使用模板为原始类型创建别名?

c++ - Navit Autotools 无需优化即可构建

c++ - 自定义 QWidget 中的背景颜色错误

c++ - 各种版本的 Mac OSX 的向后兼容性如何? (Xcode C++

c++ - 尝试播放 OpenCv 框架时挂起

java - Android Java 在单独的线程中运行类似于 C# 风格的 Action 列表

c++ - CreateThread 字符串到 LPVOID