Заполнение массива значениями с использованием многопоточности

0

Предположим, что для заполнения массива значениями используются потоки (значение одинаково для всех элементов массива для каждого потока, но разные потоки имеют разные значения). В этом коде я сталкиваюсь с проблемой, когда, когда я устанавливаю начало и нет элементов, которые поток должен заполнить в массиве, он не устанавливается правильно для первого потока, остальные, похоже, работают нормально.. может кто-нибудь мне помочь выяснить, где я иду не так, я полагаю, чтобы сделать это без блокировок, помощь была бы очень признательна !! Пример 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]<<" ";
    }
}
Теги:
arrays
multithreading

2 ответа

1
#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]<<" ";
    }
}
  • 0
    Большое спасибо, это сработало :)
  • 0
    Пожалуйста. Также не забудьте исправить это: tid[10]; "No of threads (between 1-20): "
1

Вы создаете variables v на стеке, передаете указатель на поток, v выходит из области действия на итерации цикла, вы перераспределяете [ту же] память и переписываете начальные элементы и значение, все потоки будут иметь одинаковый указатель (та же структура), я полагаю, выход быстрее, чем истек. Поместите это в runner: cout << params чтобы проверить, прав ли я.

  • 0
    Да, он должен использовать массив для аргументов начала потока, как для массива tid .
  • 0
    но если это указатель на v, как я могу привести его в бегун ?? Можете ли вы помочь мне с тем, как я должен изменить код, пожалуйста!
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню