1

我不是 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”传递给函数“Geneiraj”和“Racunaj”,但它的值总是 M*2。我明白为什么会发生这种情况,但不知道如何解决?

4

3 回答 3

0

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

于 2013-04-18T10:22:26.183 回答
0

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

  1. 像线程 id 一样构造一个数组,它将保存i每个线程的值
  2. 将此数组中的相应条目传递给线程,而不是&i传递给线程
于 2013-04-18T10:23:44.730 回答
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;
}
于 2013-04-18T10:28:30.930 回答