【问题标题】:How to make every thread pass another parameter?如何让每个线程都传递另一个参数?
【发布时间】:2013-04-11 09:51:57
【问题描述】:

我不是 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。 我明白为什么会这样,但不知道如何解决?

【问题讨论】:

  • 我想我问错了问题。我认为他们传递了正确的参数,但变量“i”在 M*2 处停止,所以当我输入“cout
  • 停止为所有变量使用相同的名称! i 是什么?

标签: c++ multithreading arguments


【解决方案1】:

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

【讨论】:

  • 你可以不用括号,因为只有 1 个 if 在循环中,并且 if 有它自己的括号
  • 它不是通过引用传递的,而是将指向它的指针传递给pthread_create,这具有相同的效果。不幸的是,pthread_create 函数需要 void* 用于用户数据,您不能按值传递!
【解决方案2】:

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

  1. 像线程 ID 一样构造一个数组,其中将保存每个线程的 i
  2. 将此数组中的相应条目而不是&amp;i 传递给线程

【讨论】:

    【解决方案3】:

    有很多选项,重要的是不要将指向同一个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;
    }
    

    【讨论】:

    • 我收到错误“警告:从不同大小的整数转换为指针 [-Wint-to-pointer-cast]”
    • 是的,现在可以使用了,非常感谢!我现在只是不明白为什么我得到所有值 0,必须修复它
    • 得到它的工作,再次非常感谢!哇,不知道我会这么快得到答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-02
    • 1970-01-01
    • 2019-09-16
    • 2011-04-27
    相关资源
    最近更新 更多