【发布时间】:2020-08-06 18:37:41
【问题描述】:
我正在寻找我做的一个练习,特别是一个类“线程管理器”,它通过将线程存储在“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;
}
这是原始代码。
如果我这样做:
std::thread p_thr = reinterpret_cast<std::thread&>(test);
或:
std::thread p_thr = *reinterpret_cast<std::thread*>(test);
或:
std::thread *temp = reinterpret_cast<std::thread*>(test);
std::thread p_thr = *temp;
我总是得到:
错误:使用已删除的函数'std::thread::thread(std::thread&)'
第一种和第二种情况在“reinterpret_cast”行上,第三种情况下在下面的赋值行上。
现在我想问题出在调用的复制构造函数上。 我搜索了一下,打开了线程类,找到了:
thread(thread&) = delete;
所以:/搜索了一下我只找到了覆盖复制构造函数的解决方案。 在这种情况下,我认为一个解决方案可以是让一个超类重新声明这个已删除的构造函数,对吧?但这只是浪费时间:/
那么有没有办法将此“void*”转换为“std::thread”对象,再次转换为“std::thread”对象? 如果是或否,请您详细解释一下吗?
非常感谢 祝你有愉快的一天和编码:D
【问题讨论】:
-
不要使用
void*。只是不要。 -
我正在使用混淆
标签: c++ void-pointers stdthread