将 void 指针指向的 std::thread 转换为对象 std::thread 而不是指向对象的指针

Z3R*_*3R0 0 c++ void-pointers stdthread

我正在寻找我所做的练习,特别是一个“线程管理器”类,它通过将线程存储在“typedef void *HANDLE;”数组中来管理线程(真的吗?哈哈)在结构 GROUP 内声明。

所以我已经让它工作了,但我看到我正在通过“reinterpret_cast”转换为“std::thread*”来转换“HANDLE”,所以“void*”。

看到后我担心:如何以及如何将其直接转换为 std::thread 对象?

我做了这个代码,例如:

#include <iostream>
#include <thread>

typedef void *HANDLE;

class thread_obj {
    public:
        void operator()(int x){
            for(int i = 0x0; i < x; i++){
                std::cout << "i = " << i << std::endl;
            }
        }
};

int main(){

    std::thread thr(thread_obj(), 0x3);
    HANDLE test = &thr;

    std::thread *p_thr = reinterpret_cast<std::thread*>(test);

    p_thr->join();

    return 0x0;
}
Run Code Online (Sandbox Code Playgroud)

这是原始代码。

如果我这样做:

std::thread p_thr = reinterpret_cast<std::thread&>(test);
Run Code Online (Sandbox Code Playgroud)

或者:

std::thread p_thr = *reinterpret_cast<std::thread*>(test);
Run Code Online (Sandbox Code Playgroud)

或者:

std::thread *temp = reinterpret_cast<std::thread*>(test);
std::thread p_thr = *temp;
Run Code Online (Sandbox Code Playgroud)

我总是得到:

错误:使用已删除的函数 'std::thread::thread(std::thread&)'

第一种和第二种情况的“reinterpret_cast”行,第三种情况的以下分配行。

现在我想问题出在调用的复制构造函数上。我搜索了一下,打开了线程类,找到了:

thread(thread&) = delete;
Run Code Online (Sandbox Code Playgroud)

所以:/稍微搜索一下,我只找到了覆盖复制构造函数的解决方案。在这种情况下,我认为一个解决方案可以使超类重新声明这个已删除的构造函数,对吗?但这只是浪费时间:/

那么有没有办法将这个“void*”转换为“std::thread”对象,再次转换为“std::thread”对象?如果是或否,你能详细解释一下吗?

非常感谢你有一个美好的一天和编码 :D

Nat*_*ica 5

你真正需要的是

std::thread& ref_thr = *reinterpret_cast<std::thread*>(test);
//         ^ declare a reference to a std::thread
Run Code Online (Sandbox Code Playgroud)

然后您可以ref_thr像使用普通对象一样使用。

正如你所发现的,复制构造函数 forstd::thread被删除,所以如果你真的想从 中创建一个线程对象test,那么你需要将投射的对象移动到new_thrlike

std::thread new_thr = std::move(*reinterpret_cast<std::thread*>(test));
Run Code Online (Sandbox Code Playgroud)

但这意味着指向 by 的对象指针test在移入new_thr. 这就是为什么要使用引用的原因,除非您确实要移动它。