gpt4 book ai didi

c++ - 将 void* 转换回数组

转载 作者:行者123 更新时间:2023-12-03 11:05:53 25 4
gpt4 key购买 nike

我有一个被转换为 void*char* 数组,但我无法访问原始数组。查看 args 数组:

void run_async(char* src, char* dest) {
char* args[] = {src, dest};
_beginthreadex(NULL, 0, copyFile, args, NULL, 0);
}

unsigned __stdcall copyFile(void* args) {
char* src = (char*)((char*)args)[0]; //!Not correct
}

我的头脑无法理解这些指针。如何在 copyFile() 函数中访问数组位置 0 和 1?

编辑:在 coderpad 上该函数适用于更新后的转换 (char**),但在使用线程执行程序期间,它不起作用

最佳答案

必须将 args 转换为 char **,因为 args 是指向第一个元素的指针,它本身就是一个 字符 *。所以你有一个所谓的“双指针”,即指向指针的指针。之后就可以在上面使用[] 下标运算符了,第二个类型转换就不需要了。

您在评论部分链接到的代码有效,但您原始问题中的代码无效的原因可能是以下原因:lifetime函数 run_async 中数组 args 的数量限制在函数 run_asyc 的生命周期内。因此你有一个 race condition .如果 run_async 函数在 copyFile 读取数组之前退出,则该数组可能同时被其他内容覆盖。

要防止这种竞争情况,您应该确保数组的生命周期超过 _beginthreadex 创建的线程的生命周期,例如

  1. 使用全局数组(最简单的解决方案,但有时被认为是糟糕的编程习惯),或者

  2. 在函数 main 中分配数组而不是 run_async,或者

  3. new[] 分配数组或 malloc并且仅在第二个线程终止后调用 delete[]free,或者让第二个线程负责调用 delete[]free 当数组不再需要时。

但是,正如评论部分所指出的,使用 C 风格的数组并调用函数 _beginthreadex 并不是解决现代 C++ 问题的理想方法。如果你使用 std::thread代替 _beginthreadex 并使用 std::array而不是 C 风格的数组,那么您可以简单地将数组按值传递给新线程。这样,您就不必担心释放数组的内存,因为没有动态内存分配。该解决方案还有一个优势,即您的代码将是可移植的,因为您不再使用特定于平台的功能。

关于c++ - 将 void* 转换回数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66268516/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com