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

标签 c++ arrays linux multithreading

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

相关文章:

c++ - std::optional<T> 和采用对 T 的非常量引用的函数

java - 我正在尝试使用一种方法来查找数组中哪些数字大于 20 并返回一个百分比

linux - linux是如何保护内存的?

arrays - 如何在声明中初始化 delphi 静态数组的特定条目?

java - 在 RecyclerView 中使用多个 View 和数据集

Linux chmod命令错误: chmod: invalid mode:

linux - 转义 bash 脚本中的特殊字符

c++ - PyBind11 与 SystemC 使用 CMake : ImportError

C++ Hook 一个dll?

c++ - C++ 模板类中的迭代器