我不是百分百肯定如何解释这一点,最好在代码中看到。
#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。 我理解为什么会这样,但不确定如何解决?
答案 0 :(得分:0)
因为你给出变量i的地址,如果我在外面改变,你的线程使用的变量也会改变,当你的线程想要访问i时,它已经在for循环中达到了2 * M的值。所以,你应该把参数i作为一个不同的指针,它指向与i相同的值(这么多我的)。
答案 1 :(得分:0)
这是一组步骤(至少一种方法)
i
的值&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;
}