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

时间:2013-04-18 10:19:11

标签: c++ multithreading arguments

我不是百分百肯定如何解释这一点,最好在代码中看到。

#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;
}

所以,我想在main函数中将变量“i”传递给函数“Generiraj”和“Racunaj”,但它的值总是M * 2。 我理解为什么会这样,但不确定如何解决?

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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

  1. 构造一个类似于线程ID的数组,它将为每个线程保存i的值
  2. 将此数组中的相应条目而不是&i传递给线程

答案 2 :(得分:0)

有很多选项,重要的是不要将指向同一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;
}