使用多线程用值填充数组
Populating an array with values using multithreads
Im假设使用线程来用值填充数组(每个线程的数组的所有元素的值都相同,但不同的线程有不同的值)。在这段代码中,我遇到了一个问题,当我设置线程必须在数组中填充的元素的开始和数量时,它没有为第一个线程正确设置,其余的似乎都能正常工作。。有人能帮我找出我哪里出了问题吗?我想不用锁就可以做到这一点,我们将不胜感激!!示例线程数=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过期的速度快。把这个放在runner:cout << params
中,检查我是否正确。
#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];
variables* v = new variables[noOfThreads];
int e=sizeOfArray/noOfThreads;
for (int i=0;i<noOfThreads;i++) {
v[i].start = e*i;
if(i==(noOfThreads-1)) {
v[i].elements=sizeOfArray-(e*(noOfThreads-1));
} else {
v[i].elements=e;
}
cout<<"Enter the value for Thread "<<i+1<<":";
cin>>v[i].value;
}
for(int i=0; i<noOfThreads; i++) {
pthread_create(&tid[i], NULL, runner,&v[i]);
}
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]<<" ";
}
}
相关文章:
- 在c++中用vector填充一个简单的动态数组
- 如何使用用户输入在C++中正确填充2D数组
- 如何找到大小'x'数组是否完全填充,在C++?
- 如何正确填充在堆上分配的二维数组?
- 如何将零填充的多维数组传递给 C++ 中的函数?
- C++ 填充数组时遇到问题
- 数组填充了不正确的值
- 使用初始化列表填充C++中的多维结构数组时出现问题
- 用数据填充未指定大小的数组
- C++填充多维标准::数组
- 如何在 c++ 上将一定大小的数组填充到另一个更大大小的数组中?
- 有没有办法使用数组填充向量?
- 如何使用 PPM 格式的 uchar* 数组填充 QPixmap
- 在C 中动态分配的数组填充
- 使用数组填充对称矩阵
- C++中的{0}数组填充赋值
- 如何在OpenCV中用OpenNi的deepPixel数组填充矩阵
- 按行、列或随机从数组填充矩阵时出现错误索引问题
- 如何加快非顺序数组填充
- 将数组填充到最大值(memcpy vs vector)