C中的空隙参数

时间:2016-02-19 01:35:56

标签: c parameters pthreads void

我正在使用pthreads并使用名为' runner'指定在线程上使用哪些方法。

这是我的跑步者功能:

void *runner(void* param){
    int* parm = (int*) param;

if(parm == 1){
    MergeSort(intArr, 0, (fileLen/2));
}

if(parm == 2){
    MergeSort(intArr, (fileLen/2)+1, fileLen - 1);
}
if(parm == 3){
    Merge(intArr, 0, (fileLen/2), fileLen - 1);

}
pthread_exit(0);
}

我的问题是当我在main中创建这个线程时,我得到一个编译器错误:"警告:指针和整数之间的比较"。

pthread_create(&tid1, &attr1, runner, 1);

我一直在尝试不同的方式来投射整数,但我仍然在努力寻找正确的方法。

4 个答案:

答案 0 :(得分:3)

第一种方法是

  1. 创建一个int对象param,其中包含您要传递的值。
  2. 获取指向该对象的指针:&param
  3. int *指针转换为void *指针。
  4. void *指针传递给pthread_create
  5. 即。在创建线程时,请执行

    int param = 1;
    int *pparam = &param;
    void *vpparam = (void *) pparam;
    pthread_create(&tid1, &attr1, runner, vpparam);
    

    以上内容可以压缩成

    int param = 1;
    pthread_create(&tid1, &attr1, runner, &param);
    

    做同样的事情。

    现在,在线程函数中我们必须反向执行所有操作

    1. 在线程函数
    2. 中接收void *指针
    3. 将收到的void *指针转换为int *类型
    4. 取消引用指针以检索int
    5. 所以,在线程函数中我们做

      void *runner(void* param) {
        int *pparam = (int *) param;
        int parm = *pparam;
      
        if (parm == 1){
          ...
        }
        ...
      }
      

      或更紧凑

      void *runner(void* param) {
        int parm = *(int *) param;
        ...
      

      请注意,在此方法中,线程函数将取消引用指针,以访问我们在int param调用之前创建的非常相同的pthread_create对象。只要线程运行,保持int对象保持活动通常很重要。

      或者,您可以尝试更多" hackerish"方法:将所需的int值转换为void *类型,并将其直接传递给pthread_create

      void *vparam = (void *) (uintptr_t) 1;
      pthread_create(&tid1, &attr1, runner, vparam);
      

      并在线程函数中将收到的void *指针转换回int类型

      void *runner(void* param) {
        int parm = (int) (uintptr_t) param;
      
        if(parm == 1){
          ...
        }
        ...
      }
      

      前一种方法直观清晰,通常更具可扩展性,如果有一天你想传递的东西比仅仅int更重。

答案 1 :(得分:3)

pthread_create期望其第四个参数void*,对应于void*的{​​{1}}输入,但您将runner传递给int 。相反,创建一个int变量并将其地址作为第四个参数传递,例如:

int param = 1;
pthread_create(&tid1, &attr1, runner, &param);

答案 2 :(得分:0)

  

我一直尝试不同的方式来投射整数,但我仍然在努力寻找正确的方法

试试这个: StringLengthAttribute Class

并在线程函数中:

pthread_create(&tid1, &attr1, runner, (void*)(intptr_t)1);

答案 3 :(得分:0)

该函数采用void *,一个void指针。在C中,void指针用于指向内存中未指定的类型。它是在C ++发明模板之前用于泛型的东西

  std::vector<int> vector;

由于参数是指针,因为AnT表示你应该将函数传递给指针。上面的代码看起来很有效。如果你想要你可以施展

   pthread_create(&tid1, &attr1, runner, (void*)1);