Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows CreateThread传递参数失败?_Windows_Multithreading_Createthread - Fatal编程技术网

Windows CreateThread传递参数失败?

Windows CreateThread传递参数失败?,windows,multithreading,createthread,Windows,Multithreading,Createthread,我的代码是这样的 starts是DWORD32的数组 线程是一个句柄数组 为什么结果是这样的?我们看不到启动的范围,但这可以从失败中猜出来。它可能是一个局部变量,在线程开始运行时就消失了。所以你只能读垃圾。您需要一个稳定的指针,从全局变量或malloc获取一个 编辑后:不要那样打免费电话。它必须保持稳定,直到所有线程都使用完它。你可以考虑用互锁减量对它进行计数。< p>在创建线程后立即释放开始数组。因此,所发生的情况是,线程被传递到内存的指针,这些内存可能在线程有机会读取之前就被释放了。如果发生

我的代码是这样的

starts是DWORD32的数组

线程是一个句柄数组

为什么结果是这样的?

我们看不到启动的范围,但这可以从失败中猜出来。它可能是一个局部变量,在线程开始运行时就消失了。所以你只能读垃圾。您需要一个稳定的指针,从全局变量或malloc获取一个

编辑后:不要那样打免费电话。它必须保持稳定,直到所有线程都使用完它。你可以考虑用互锁减量对它进行计数。

< p>在创建线程后立即释放开始数组。因此,所发生的情况是,线程被传递到内存的指针,这些内存可能在线程有机会读取之前就被释放了。如果发生这种情况,则结果行为是未定义的

您可以通过确保指针引用的内存的生存期超出线程的生存期来解决此问题。通常,您可以通过在堆外为每个线程分配数据,并让线程在获取信息副本后释放调用来实现这一点

在这种情况下,解决问题的更简单方法是传递整数值,而不是指向整数值的指针。像这样:

threads[i] = CreateThread(NULL, 0, portionCal, (void*)starts[i], 0, NULL);
在你的帖子里:

DWORD32 start = (DWORD32)pArg;

starts没有本地值,我将完整代码放在问题中感谢我找到了错误,我在线程initI回滚您的问题编辑之前立即释放了启动。你问了这个问题。你对这个问题有两个答案。重复这个问题的答案毫无意义。
threads[i] = CreateThread(NULL, 0, portionCal, (void*)starts[i], 0, NULL);
DWORD32 start = (DWORD32)pArg;