thi*_*not 4 c++ arrays multithreading
我正在学习线程,我发现了一些简单的例子.
我希望做的是创建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;
}
}
Run Code Online (Sandbox Code Playgroud)
首先要注意的是:
for (int i = 0; i < numRuns; i++)
{
_beginthread( myThread, 0, (void *) (array1) );
_beginthread( myThread2, 0, (void *) (array2) );
}
Run Code Online (Sandbox Code Playgroud)
要求立即_beginthread返回.他们不等待线程完成,甚至开始.它只是将操作系统调度程序中的线程排队并返回.
但是,上面的代码是main()函数的结尾.我非常怀疑在一个Release版本中你的线程甚至会在整个程序退出之前进行初始化.您需要构建一种机制,通过该机制,主线程将在程序关闭之前等待工作线程完成其工作.这样做超出了SO帖子的范围,但是请查看CreateEvent()和WaitForMultipleObjects().
您需要了解的下一件事是您发送给线程的内容的生命周期和所有权语义.您正在将指针传递给数组,这些数组是作用于的自动变量main():
int array1[1000000];
int array2[1000000];
Run Code Online (Sandbox Code Playgroud)
一旦声明这些数组的范围(此处main())退出,变量就不再存在.将指向本地范围的变量的指针传递给工作线程很少(如果有的话)是正确的 - 如果本地范围在线程完成之前退出,则永远不会更正.
动态分配这些数组然后将它们的所有权转移到工作线程将解决这个问题.执行此操作时,请在管理这些对象/数组的所有权语义时小心.