C++ c++;多线程数组

C++ c++;多线程数组,c++,arrays,multithreading,C++,Arrays,Multithreading,我正在做一些有趣的事情,试图学习多线程 但是Arno指出,我通过process.h的线程不是多线程的 我希望做的是,我有一个100(或10000,我不认为这真的很重要)的数组,并将值分配给每个线程。例如,4个线程=每个要分配的线程250个值 然后我可以使用这个填充数组进行进一步的计算 下面是我正在编写的一些代码(不起作用) #包括 #包括 #包括 #包括 #包括 //#包括 使用名称空间std; 无效读取(无效*虚拟); 临界截面cs1、cs2;//全球的 int main() { 流文件;

我正在做一些有趣的事情,试图学习多线程

但是Arno指出,我通过process.h的线程不是多线程的

我希望做的是,我有一个100(或10000,我不认为这真的很重要)的数组,并将值分配给每个线程。例如,4个线程=每个要分配的线程250个值

然后我可以使用这个填充数组进行进一步的计算

下面是我正在编写的一些代码(不起作用)

#包括
#包括
#包括
#包括
#包括
//#包括
使用名称空间std;
无效读取(无效*虚拟);
临界截面cs1、cs2;//全球的
int main()
{
流文件;
myfile.open(“cointost.csv”);
内部;
长纽伦;
长计数=0;
整数除数=1;
浮点数=0;
int计数器=0;
浮动百分比=0.0;
句柄hThread[1000];
整数数组[10000];
srand(时间(空));
printf(“运行次数(使用10的倍数)”;
cin>>numRuns;
for(int i=0;i

有人能解释为什么它不工作吗?

您应该知道,
rand
不是线程安全的

甚至有一篇关于它的帖子,所以:

如果您可以找到一个线程安全的随机数生成器,那么使用OpenMP进行并行循环会更好,因为它维护的线程池比使用线程API效率更高

否则,向线程函数中传递一个结构可能会带来好处,该结构会为您提供所需的数组和长度:

struct ArraySlice
{
    ArraySlice( int *arr, size_t start, size_t end)
        : pBegin( arr + start )
        , pEnd( arr + end )
    {}

    int *pBegin, *pEnd;
};
然后创建你的线程

size_t arrayLength = 1000000;
size_t sliceLength = arrayLength / numRuns;

for (size_t i = 0; i < numRuns; i++)
{
    size_t start = i * sliceLength;
    size_t end = min( start + sliceLength, arrayLength );
    ArraySlice *slice = new ArraySlice(array, start, end);
    hThread[i] = (HANDLE)_beginthread( myThread, 0, (void*)slice );
}

对于初学者,使用_beginthreadex而不是_beginthread,这会在正常运行时关闭线程句柄。如果线程句柄在开始WFMO之前关闭,它可能会立即中断,因为一个或多个句柄将无效

第二,你把手上的i*2是怎么回事?向WFMO发送句柄列表时,每隔一个句柄为NULL,很可能会立即出错

第三,WFMO的最大等待列表长度为64个线程,因此当您达到65个或更多线程时,您的1000个线程的列表将保证吐出。。你可能想考虑限制天花板。实际值是MAX_WAIT_OBJECTS(或者接近这个值,我记不清了)


在我们开始保护您要共享的阵列之前,就已经完成了这些

函数“int main()”中的g:\dev\threaded.cpp |:| g:\dev\threaded.cpp | 57 |错误:从“long unsigned int”到“void*”的转换无效| | |==生成完成:1个错误,0个警告===|这似乎是一条错误消息。在这种形式下,它对我没有多大用处,但应该对你有用;这很公平。由于您没有在提供的代码中强制转换它,我认为您的编译器很高兴。我只是复制了前面的一个示例,我不知道I*2是什么。我对如何实现这一点有完全不同的想法,它不是每个元素的线程。我希望有4个线程处理多达100个元素,然后这个100个元素的数组被转到main进行处理,副本来自answer。i*2最初是i*2+1,当上面的行没有注释掉时,它是有意义的。您注释掉了包含
标题的内容,为什么?为什么不使用C++中的标准线程设施呢?
size_t arrayLength = 1000000;
size_t sliceLength = arrayLength / numRuns;

for (size_t i = 0; i < numRuns; i++)
{
    size_t start = i * sliceLength;
    size_t end = min( start + sliceLength, arrayLength );
    ArraySlice *slice = new ArraySlice(array, start, end);
    hThread[i] = (HANDLE)_beginthread( myThread, 0, (void*)slice );
}
void myThread (void *param )
{
    ArraySlice *slice = (ArraySlice*)param;
    if( !slice ) return;

    for( int *pos = slice->pBegin, *end = slice->pEnd; pos != end; pos++ )
    {
        *pos = rand();  // Except you need a thread-safe rand() function...
    }

    delete slice;
}