C++ 创建线程在数组上执行计算-似乎无法正确访问数组

C++ 创建线程在数组上执行计算-似乎无法正确访问数组,c++,multithreading,pthreads,argument-passing,C++,Multithreading,Pthreads,Argument Passing,好的,我将一个参数传递给一个线程,我用它来告诉它在数组中的位置。我已经消除了之前抛出的分段错误,但它仍然不能像我希望的那样工作。传递到指针中的int似乎在某个地方发生了变化。这就抛出了整个数组,我得到了真正的随机数。如果有任何可能的方式,任何人都可以帮助我排序这将是非常感谢。我希望代码所要做的就是通读一个2d数组,选择一个随机数(1、2或5)来决定一个线程将处理数组中的多少行,然后创建多个线程来处理数组中的行。这可能是一个错误的方法,但我不知道怎么做。这应该是课堂作业,以帮助我理解线程等,但到目

好的,我将一个参数传递给一个线程,我用它来告诉它在数组中的位置。我已经消除了之前抛出的分段错误,但它仍然不能像我希望的那样工作。传递到
指针中的int似乎在某个地方发生了变化。这就抛出了整个数组,我得到了真正的随机数。如果有任何可能的方式,任何人都可以帮助我排序这将是非常感谢。我希望代码所要做的就是通读一个2d数组,选择一个随机数(1、2或5)来决定一个线程将处理数组中的多少行,然后创建多个线程来处理数组中的行。这可能是一个错误的方法,但我不知道怎么做。这应该是课堂作业,以帮助我理解线程等,但到目前为止,我认为这只是让我更困惑!如果可以的话,请帮忙

int threadArray[10][10];
int arrayVar[10][2];

using namespace std;

void *calc(void *pointer){

  int *point, pointerA;
  point = (int *) pointer;
  pointerA = *point;

  int startPoint = arrayVar[pointerA][0];
  int endPoint = arrayVar[pointerA][1];

  int newArray[10][10];
  int calculated;

  for (int i = startPoint ; i < endPoint; i++){
    for (int j = 0; j < 10; j++){
      calculated = (threadArray[i][j] * 2 + 4) * 2 + 4;
      newArray[i][j] = calculated;
    }
  }

  for (int i = startPoint; i < endPoint; i++){
      for (int j = 0; j < 10; j++){
    cout << newArray[i][j] << " ";
      }
      cout << endl;
   }
  return 0;
}

int main(){
  int rc;
  int start = 0;
  int end;

  ifstream numFile;
  numFile.open("numbers.txt");

  if (numFile.is_open()){

    for (int row = 0; row < 10; row++){
      std::string line;
      std::getline(numFile, line);

      std::stringstream iss(line);

      for (int col = 0; col < 10; col++){
          std::string num;
      std::getline(iss, num, ' ');

          std::stringstream converter(num);
      converter >> threadArray[row][col];
      }

    }

    cout << "Original 2D Array" << endl << endl;
    for (int i = 0; i < 10; i++){
      for (int j = 0; j < 10; j++){
        cout << threadArray[i][j] << " ";
      }
      cout << endl;
    }

    cout << endl;
  }

    srand (time(NULL));

    const int rowArray[3] = {1, 2, 5};

    int arrayIndex = rand() % 3;
    int noOfRows = (rowArray[arrayIndex]);
    end = noOfRows;
    int noOfThreads = 10 / noOfRows;

    pthread_t threads[noOfThreads];

    arrayVar[noOfThreads][2];
    start = 0;
    end = noOfRows;

    for (int a = 0; a < noOfThreads; a++){
      arrayVar[a][0] = start;
      arrayVar[a][1] = end;
      start = start + noOfRows + 1;
      end = end + noOfRows + 1;
    }

    int *pointer = 0;

    cout << "2D Array Altered" << endl << endl;

    for (int t = 0; t < noOfThreads; t++){
      pointer = (int *) t;
      rc = pthread_create(&threads[t], NULL, calc, &pointer);
    }

    for (int t = 0; t < noOfThreads; t++){
      rc = pthread_join(threads[t], NULL);
    }
    pthread_exit(NULL);
}
int-threadArray[10][10];
int arrayVar[10][2];
使用名称空间std;
void*计算(void*指针){
int*点,pointerA;
点=(int*)指针;
pointerA=*点;
int startPoint=arrayVar[pointerA][0];
int endPoint=arrayVar[pointerA][1];
int newArray[10][10];
int计算;
对于(int i=startPoint;i
for (int t = 0; t < noOfThreads; t++) {
  pointer = (int *) t;
  rc = pthread_create(&threads[t], NULL, calc, &pointer);
}

或者动态分配存储以向线程函数传递一个整数。

这是一个完全重复的问题,由同一用户提出,该问题刚刚被用户删除:
void *calc(void *pointer) {
  int t = reinterpret_cast<int>(pointer);  
  // ...
}

// snip

for (int t = 0; t < noOfThreads; t++) {
  rc = pthread_create(&threads[t], NULL, calc, reinterpret_cast<void*>(t));
}