c++ - 在线程之间 move vector

标签 c++ multithreading c++11 move-semantics

我有一个线程使用这样的公共(public)接口(interface)不断收集数据项:

class MyThread {
public:
    class Item {
        // ...
    };

    startup();
    shutdown();

    bool hasItems() const;

    // retrieve collected items
    std::vector<Item>&& items();
private:
    std::mutex itemMutex;
    std::vector<Item> currentItems;
};

检索项目还应该清除线程​​的项目列表。我返回一个右值,以便在调用方调用 move 构造函数。当然,检索项目应该是线程安全的,因此实现如下所示:

std::vector<MyThread::Item>&& MyThread::items() {
    std::lock_guard<std::mutex> lock(itemMutex);
    return std::move(currentItems);
}

我认为这里的锁释放得太早:该函数返回右值 vector ,但当 std::lock_guard 被销毁时,不一定会用它调用 move 构造函数并释放互斥体。所以据我了解,这不是线程安全的。我对吗?如何使其成为线程安全的?

最佳答案

你是对的,它不是线程安全的,因为 move 将在方法返回后发生,此时锁将被释放。要修复它,只需将 vector move 到一个局部变量中并返回它:

std::vector<MyThread::Item> MyThread::items() 
{
    std::lock_guard<std::mutex> lock(itemMutex);
    return std::vector<MyThread::Item>(std::move(currentItems));
}

关于c++ - 在线程之间 move vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21280917/

相关文章:

c++ - 将任何函数作为模板参数传递

c++ - unique_ptr 与 shared_ptr 中的删除器类型

c++ - 使用纯头库时增加链接器错误

c# - 如何将(和 Marshall)CityHash std::pair<uint64,uint64> 从 C# 转换为 C++,反之亦然

c++ - Multimap 与运算符不匹配==

multithreading - 线程加工 AX 2012

java - 在单线程上下文中使用 JMS session 对象的原因

c++ - 如何使用插入函数和迭代器更改 vector 中的元素?

c++ - for 循环 c++ 'toupper' 实现

multithreading - 是否对通过 tcp 套接字发送的并发文件使用互斥锁