如何让每个线程传递另一个参数
How to make every thread pass another parameter?
我不是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;
}
下面是一组步骤(至少一种方法)
- 构造一个像线程id那样的数组,它将保存每个线程的
i
值 - 从这个数组传递相应的条目而不是
&i
到线程
因为你给出了变量i的地址,如果i在外部改变,你的线程使用的变量i也会改变,当你的线程想要访问i时,它已经达到了for循环中的2*M的值。所以,你应该给参数i一个不同的指针,它指向与i相同的值(这么多i)。
相关文章:
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 修改函数中的指针(将另一个指针作为参数传递)
- 如何将一个类的函数作为另一个类的另一个函数的参数传递
- C++重载函数,一个采用基类的参数,另一个采用派生类的参数
- 如果需要转换,我可以在读取参数的同时将其移动到另一个参数吗?
- 如何在另一个函数中使用返回值作为参数?
- 如果模板参数是另一个模板的实例化,则键入特征测试
- 如何使用另一个类中的公共成员函数作为参数调用线程
- 如何将 lambda 函数作为参数发送到另一个函数
- 如何设置默认参数以防用户不输入另一个参数
- 将另一个参数传递给函子的库
- 一个C++默认参数可以用另一个参数初始化吗
- 从另一个参数引用的模板可变参数
- 如何根据c++中getopt中另一个参数的存在来解析其他参数
- 如何让每个线程传递另一个参数
- 从另一个参数的值设置默认参数值
- 使用参数的 getter 之一在 C++ 函数中设置另一个参数的值?
- Qt:用另一个参数创建一个新类
- 谷歌模拟,使用另一个参数的参数匹配器
- 非类型模板参数,其类型依赖于另一个参数