C++ 如何使每个线程传递另一个参数?
我不是100%确定如何解释这一点,最好在代码中看到C++ 如何使每个线程传递另一个参数?,c++,multithreading,arguments,C++,Multithreading,Arguments,我不是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){ f
#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;
}
#包括
#包括
#包括
#包括
#包括
#定义n30
使用名称空间std;
国际ZajednickoPolje[50][N];
void*Generiraj(void*i){
for(int j=0;j因为你给出的是变量i的地址,如果我在外部改变,你线程使用的变量i也会改变,当你的线程想要访问i时,它在for循环中已经达到了2*M的值。因此,你应该给参数i一个不同的指针,它指向与i相同的值(如此多的i).以下是一组步骤(至少一种方法)
像对待线程ID那样构造一个数组,它将为每个线程保存i
的值
将此数组中的相应条目而不是&i
传递给线程
有很多选项,重要的是不要将指向相同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;
}
for(i=0;我猜我问错了问题..我认为它们传递了正确的参数,但变量“i”停在M*2,所以当我把"coutStop给所有变量起相同的名字!什么是i
?你可以不用括号,因为循环中只有1个if,if有自己的括号。它不是通过引用传递的,而是一个指向它的指针传递给pthread\u create
,这具有相同的效果。不幸的是pthread\u create
函数eexpects avoid*
对于用户数据,您不能通过值传递!我得到错误“警告:从不同大小的整数转换为指针[-Wint转换为指针转换]”是的,现在它工作了,非常感谢!我只是不明白为什么我现在得到所有值0,必须修复它工作了,再次感谢!哇,不知道我会这么快得到答案