Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使每个线程传递另一个参数?_C++_Multithreading_Arguments - Fatal编程技术网

C++ 如何使每个线程传递另一个参数?

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

我不是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;
}
#包括
#包括
#包括
#包括
#包括
#定义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 a
    void*
    对于用户数据,您不能通过值传递!我得到错误“警告:从不同大小的整数转换为指针[-Wint转换为指针转换]”是的,现在它工作了,非常感谢!我只是不明白为什么我现在得到所有值0,必须修复它工作了,再次感谢!哇,不知道我会这么快得到答案