Предположим, что для заполнения массива значениями используются потоки (значение одинаково для всех элементов массива для каждого потока, но разные потоки имеют разные значения). В этом коде я сталкиваюсь с проблемой, когда, когда я устанавливаю начало и нет элементов, которые поток должен заполнить в массиве, он не устанавливается правильно для первого потока, остальные, похоже, работают нормально.. может кто-нибудь мне помочь выяснить, где я иду не так, я полагаю, чтобы сделать это без блокировок, помощь была бы очень признательна !! Пример no of threads = 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]<<" ";
}
}
#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]<<" ";
}
}
Вы создаете variables v
на стеке, передаете указатель на поток, v выходит из области действия на итерации цикла, вы перераспределяете [ту же] память и переписываете начальные элементы и значение, все потоки будут иметь одинаковый указатель (та же структура), я полагаю, выход быстрее, чем истек. Поместите это в runner: cout << params
чтобы проверить, прав ли я.
tid
.
tid[10];
"No of threads (between 1-20): "