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

C++ Thread in an unordered_map (no copy constructor)

我正在尝试找出一种方法来从 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?

std::thread getThread(int handle)

是一个按值returns的函数。这需要一个 non-deleted 复制构造函数。正如您所注意到的,std::thread 的复制构造函数已被删除。

解决方案:Return参考

std::thread & getThread(int handle)

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

如果 "get the std::thread back out of this unordered_map" 你想从 ThreadContainer 中删除 thread 你可以

std::thread&& removethread(int handle)
{
    return std::move(map_.at(handle));
}

但这将在 map_ 中留下一个 "dead" 线程。您可能想要删除密钥和 now-unattached thread.

std::thread&& removethread(int handle)
{
    std::thread temp(std::move(map_.at(handle)));
    map_.erase(handle);
    return std::move(temp);
}

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