如何让每个线程传递另一个参数

How to make every thread pass another parameter?

本文关键字:另一个 参数 线程      更新时间:2023-10-16

我不是100%确定如何解释这一点,最好在代码中看到。

#include <unistd.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <pthread.h>
#define N 30
using namespace std;
int ZajednickoPolje[50][N];
void *Generiraj(void * i){
    for(int j=0;j<N;j++)
        ZajednickoPolje[*((int*)i)][j]=rand()%50;
}
void *Racunaj(void * i){
    int suma=0;
    for(int j=0;j<N;j++)
        suma=suma+ZajednickoPolje[*((int*)i)][j];
    sleep(1);
    cout<<"Polje"<<*((int*)i)<<" suma = "<<suma<<endl;
    sleep(1);
    cout<<"Polje"<<*((int*)i)<<" aritm_sredina = "<<float(suma)/N<<endl;
}
int main(){
   int M, i;
   cin>>M;
   pthread_t thr_id[M*2];
    for(i=0;i<M;i++)
   if (pthread_create(&thr_id[i], NULL, Generiraj, &i) != 0) {
      cout<<"Greska pri stvaranju dretve!n";
      exit(1);
   }
    for(i=M;i<(2*M);i++)
   if (pthread_create(&thr_id[i], NULL, Racunaj, &i) != 0) {
      cout<<"Greska pri stvaranju dretve!n";
      exit(1);
   }
   for(int i=0;i<(2*M);i++)
   pthread_join(thr_id[i], NULL);
   return 0;
}

所以,我想在主函数中传递变量"I"给函数"Generiraj"answers"Racunaj",但它的值总是M*2。我明白为什么会这样,但不知道如何解决它?

有很多选择,重要的是不要将指向相同i的指针传递给所有线程。这是一个选项,为整数创建动态存储;

for(i=0;i<M;i++) {
   if (pthread_create(&thr_id[i], NULL, Generiraj, new int(i)) != 0) {
      cout<<"Greska pri stvaranju dretve!n";
      exit(1);
   }
}
void *Generiraj(void * ptr){
    int i = *(int*)ptr;
    delete   (int*)ptr;
    for(int j=0;j<N;j++)
        ZajednickoPolje[i][j]=rand()%50;
    return NULL;
}

下面是一组步骤(至少一种方法)

  1. 构造一个像线程id那样的数组,它将保存每个线程的i
  2. 从这个数组传递相应的条目而不是&i到线程

因为你给出了变量i的地址,如果i在外部改变,你的线程使用的变量i也会改变,当你的线程想要访问i时,它已经达到了for循环中的2*M的值。所以,你应该给参数i一个不同的指针,它指向与i相同的值(这么多i)。