【问题标题】:Convert std::thread pointed by void pointer to object std::thread instead of pointer to object将 void 指针指向的 std::thread 转换为对象 std::thread 而不是指向对象的指针
【发布时间】: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


【解决方案1】:

你真正需要的是

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

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

如你所见,std::thread 的复制构造函数被删除了,所以如果你真的想从test 创建一个线程对象,那么你需要将转换后的对象移动到new_thr 中

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

但这意味着test 指向的对象指针不再可用,因为它已移至new_thr。这就是为什么要使用引用的原因,除非您真的想移动它。

【讨论】:

  • 感谢您的快速答复!我用引用尝试了该方法,它显然有效(:我没有考虑使用引用。在我的情况下,第一个答案是我需要的,因为我仍然需要“测试”指向的对象保留在他在内存中的位置
  • 那些reinterpret_casts 应该是static_casts。 static_cast 在这里就足够了,所以不需要reinterpret_cast 大锤。
猜你喜欢
  • 2021-07-22
  • 2021-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-11-29
  • 2011-02-06
  • 1970-01-01
  • 2013-10-24
  • 1970-01-01
相关资源
最近更新 更多