unordered_map 中的 C++ 线程(无复制构造函数)

Posted

技术标签:

【中文标题】unordered_map 中的 C++ 线程(无复制构造函数)【英文标题】:C++ Thread in an unordered_map (no copy constructor) 【发布时间】:2018-02-27 22:25:12 【问题描述】:

我正在尝试找出一种方法来从 c++ 中的 unordered_map 中获取线程。

但是,我得到 std::thread::thread(const std::thread &) 试图引用已删除的函数

例子:

#include "stdafx.h"
#include <unordered_map>
#include <thread>

class ThreadContainer

    std::unordered_map<int, std::thread> map_;
public:
    void addThread(int handle, std::thread thread)
    
        map_.emplace(std::move(handle), std::move(thread));
    

    std::thread getThread(int handle)
    
        return map_.at(handle);
    
;

int main()

    ThreadContainer testing;

    return 0;

在这个代码示例中,我尝试了return map_.at(handle);return std::move(map_.at(handle);,这些似乎都不起作用。

如何从这个 unordered_map 中取出 std::thread?

【问题讨论】:

“我猜...” 你猜错了。 “如果那是真的……” 那不是真的。你真正的问题是什么?你想问什么? 【参考方案1】:
std::thread getThread(int handle)

是一个按值返回的函数。这需要一个未删除的复制构造函数。如您所述,std::thread 的复制构造函数已被删除。

解决方法:引用返回

std::thread & getThread(int handle)

并确保接收者也是参考。不要在链中的任何位置强制复制。

如果通过“从这个 unordered_map 中取出 std::thread”,你想从 ThreadContainer 中删除 thread,你可以

std::thread&& removethread(int handle)

    return std::move(map_.at(handle));

但这会在map_ 中留下一个“死”线程。您可能想要删除密钥和现在未附加的 thread

std::thread&& removethread(int handle)

    std::thread temp(std::move(map_.at(handle)));
    map_.erase(handle);
    return std::move(temp);

另请注意,ThreadContainer 将不可复制,因为包含的 threads 无法复制。如果您使用delete ThreadContainer 的复制构造函数和赋值运算符,您将收到更易读的错误消息。

【讨论】:

以上是关于unordered_map 中的 C++ 线程(无复制构造函数)的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中的 unordered_map 的并发读取和锁定单线程写入之间交替

C++ 11 unordered_map 分段错误

如何在 C++ 中单独锁定 unordered_map 元素

与 C++ unordered_map 的并行性

C++ 中的异步线程安全日志记录(无互斥体)

c++ 中的 map 和 unordered_map 在内存使用方面有啥区别吗?