gpt4 book ai didi

c++ - 使用多线程用值填充数组

转载 作者:太空宇宙 更新时间:2023-11-04 09:42:02 30 4
gpt4 key购买 nike

我假设使用线程用值填充数组(每个线程的所有数组元素的值都相同,但不同的线程具有不同的值)。在这段代码中,我遇到了一个问题,当我设置线程必须在数组中填充的开始和元素时,它没有为第一个线程正确设置,其余的似乎工作正常..有人可以帮助我弄清楚我哪里出错了,我想在没有锁的情况下做到这一点,帮助将不胜感激!线程数示例 = 2数组大小 = 3第一个线程将填充前 2 个元素,第二个线程将填充最后 3 个元素..

    #include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;

int* array;

struct variables
{
int start;
int elements;
int value;
};

void* runner(void *param)
{
//int e=atoi((char*)param);
variables* a=(struct variables*)param;
cout<<"start="<<a->start<<endl;
cout<<"elements"<<a->elements<<endl;
cout<<"value"<<a->value<<endl;
for(int i=a->start, j=0; j<a->elements; i++, j++ )
{
array[i]=a->value;
}
}

int main()
{
pthread_t tid[10];
int noOfThreads, sizeOfArray;
cout<<"No of threads (between 1-20): ";
cin>>noOfThreads;
cout<<"size of array: ";
cin>>sizeOfArray;

array = new int[sizeOfArray];
int e=sizeOfArray/noOfThreads;

//int start=0;

for(int i=0,j=0; i<noOfThreads; i++)
{
variables v;
cout<<"i="<<i<<endl;
v.start=(e*j);
cout<<"v.start="<<v.start<<endl;
cout<<"j="<<j<<endl;
if(i==(noOfThreads-1))
{
e=sizeOfArray-(e*(noOfThreads-1));
cout<<"e="<<e<<endl;
}
cout<<"Enter the value for Thread "<<i+1<<":";
cin>>v.value;
v.elements=e;
pthread_create(&tid[i], NULL, runner,&v);
j++;
}

for(int i=0; i<noOfThreads; i++)
{
pthread_join(tid[i], NULL);
}

for(int i=0; i<noOfThreads; i++)
{
cout<<"tid="<<tid[i]<<endl;
}

cout<<"printing array"<<endl;
for(int i=0; i<sizeOfArray; i++)
{
cout<<array[i]<<" ";
}
}

最佳答案

您创建 variables v在堆栈上,将指针传递给线程,v 在循环迭代时超出范围,重新分配 [相同] 内存并重写起始元素和值,我相信所有线程都将具有相同的指针(相同的结构),除非它们退出的速度比 v 快已到期。把它放在运行者中:cout << params检查我是否正确。

关于c++ - 使用多线程用值填充数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20444206/

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