gpt4 book ai didi

c++ - 通过引用线程传递数组的问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:20:04 25 4
gpt4 key购买 nike

我正在学习线程,并且找到了一些简单的示例。

我希望做的是创建 5 个线程,每个线程将一个随机数分配给 20 个 int 的数组。然后最后有另外 5 个线程将这个数组重建为一个更大的 100 大小的 int。

这是我之前尝试的一些代码。我希望能够通过引用传递数组,但没有成功。

任何想法将不胜感激,请记住,我是线程的新手

#include <process.h>
#include <windows.h>
#include <iostream>
#include <fstream>
#include <time.h>
//#include <thread>

using namespace std;

void myThread (void *dummy );
void myThread2 (void *dummy );

int main()
{

ofstream myfile;
myfile.open ("coinToss.csv");

int rNum;

long numRuns;
long count = 0;
int divisor = 1;
float holder = 0;
int counter = 0;
float percent = 0.0;

int array1[1000000];
int array2[1000000];


srand ( time(NULL) );

printf ("Runs (use multiple of 10)? ");
cin >> numRuns;

for (int i = 0; i < numRuns; i++)
{
_beginthread( myThread, 0, (void *) (array1) );
_beginthread( myThread2, 0, (void *) (array2) );

}

}

void myThread (void *param )
{
int i = *(int *)param;

for (int x = 0; x < 1000000; x++)
{
//param[x] = rand() % 2 + 1;
i[x] = rand() % 2 + 1;
}

}

void myThread2 (void *param )
{
int i[1000000] = *(int *)param;

for (int = 0; x < 1000000; x++)
{
i[x] = rand() % 2 + 1;
}

}

最佳答案

首先你需要意识到的是:

 for (int i = 0; i < numRuns; i++)
{
_beginthread( myThread, 0, (void *) (array1) );
_beginthread( myThread2, 0, (void *) (array2) );

}

_beginthread 的调用立即 返回。他们不等待线程完成,甚至不等待线程开始。它只是将操作系统调度程序中的线程排队并返回。

但是,上面的代码是 main() 函数的结尾。我非常怀疑,在发布版本下,您的线程甚至会在整个程序退出之前初始化。您需要构建一种机制,通过该机制您的主线程将等待工作线程在您的程序关闭之前完成它们的工作。这样做超出了 SO 帖子的范围,但请查看 CreateEvent()WaitForMultipleObjects() .

接下来您需要了解的是您发送给线程的内容 的生命周期和所有权语义。您正在传递指向数组的指针,这些数组是 main() 范围内的自动变量:

 int array1[1000000];
int array2[1000000];

一旦声明这些数组的范围(此处为 main())退出,变量不再存在。将指向局部作用域变量的指针传递给工作线程的做法很少(如果有的话)是正确的——永远如果局部作用域在线程完成之前退出则不正确。

动态分配这些数组,然后将它们的所有权转移给工作线程将解决这里的问题。执行此操作时,请在管理这些对象/数组的所有权语义时小心。

关于c++ - 通过引用线程传递数组的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12801862/

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