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
你真正需要的是
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. 这就是为什么要使用引用的原因,除非您确实要移动它。
| 归档时间: |
|
| 查看次数: |
65 次 |
| 最近记录: |