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
将不可复制,因为包含的 thread
s 无法复制。如果您使用delete
ThreadContainer
的复制构造函数和赋值运算符,您将收到更易读的错误消息。
【讨论】:
以上是关于unordered_map 中的 C++ 线程(无复制构造函数)的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C++ 中的 unordered_map 的并发读取和锁定单线程写入之间交替