使用多线程用值填充数组

Populating an array with values using multithreads

本文关键字:数组 填充 多线程      更新时间:2023-10-16

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]<<" ";
    }
}