在C ++中将单个整数传递给多线程函数

时间:2016-09-21 07:43:01

标签: c++ multithreading pthreads

我想用多线程调用一个函数,我只需要将一个整数传递给该函数(线程id,所以如果它是可访问的,我不需要传递值)。

我应该怎么做?

例如:

for(int i=0; i < numberOfThread; i++ ){
      pthread_create(&threads[i], NULL, multichaper, &td[i]);
}

其中multichaper是我的函数,threadID是整数。

更新:我将来自user3286661的答案标记为正确答案,这对我有用,如果您想要更详细的答案,可以在答案中查看我自己的问题解决方案。

5 个答案:

答案 0 :(得分:1)

这方面的一般方法是制作如下函数:

void* multichaper(void* arg)  {
    int tid = *(int*)arg;
    ...
}

在致电pthread_create时:

pthread_create(&threads[i], NULL, multichaper, &td[i])

其中td[i]int

答案 1 :(得分:1)

没有。你不能这样做。您传递给pthread_create的功能必须具有签名void *(*start_routine) (void *)。也就是说,一个函数将非const指针指向void并将非const指针返回void。

最简单的方法是:

int *arg = new int(threadID);
pthread_create(&threads[i], NULL, multichaper, threadID );

然后multichaper看起来像:

void *multichaper(void *arg)
{
    int *pint = static_cast<int*>(arg);
    int threadID = *pint;
    delete pint;
    ...
    return nullptr;
}

请注意,我已经在堆上分配了int,以避免担心变量的生命周期。如果你可以保证调用函数中的变量threadID将比线程更长,那么你可以跳过该位。

我强烈建议您使用C + 11和内置线程库,或者如果您不能这样做,请使用boost :: threads。他们都让这更容易!

答案 2 :(得分:1)

你真的应该考虑转向C ++ 11线程:

#include <thread>
#include <iostream>

void show_id(int id) {
    std::cout << id << std::endl;
}

int main()
{
    std::thread t(show_id, 10);
    t.join();
}

如果你必须使用pthreads,那么:

#include <iostream>
#include <pthread.h>

void *show_id(void *x_void_ptr)
{
    const int id = *static_cast<int *>(x_void_ptr);

    std::cout << id << std::endl;

    return NULL;
}

int main()
{
     pthread_t t;

     int id = 10;
     if(pthread_create(&t, NULL, show_id, &id)) {
         std::cerr << "couldn't create" << std::endl;

         return -1;
     }

     if(pthread_join(t, NULL)) {
         std::cerr << "couldn't join" << std::endl;

         return -2;
    }
}

注意第一个版本的好坏:

  1. 没有演员阵容

  2. 更少的明确检查

  3. 您传递的对象的生命周期没有问题 - 在第一个版本中,您将指针传递给它,因此必须确保它已经过去了#34;&#34;活着&#34;线程正在使用它。

  4. 没有不直观的void *返回(具有相同的生命周期问题)。

答案 3 :(得分:0)

由于我想将数字从0传递到NumberOfThreads到我的函数,我终于使用了下面的代码,通过在struct内传递一个整数并在尝试检索{时锁定(lock_mutex) {1}}:

threadNum class:

的成员函数中的多线程中调用函数
SVAnchor

pthread_t threads[this->numberOfThread]; pthread_attr_t attr; params_t params; pthread_mutex_init (&params.mutex , NULL); pthread_cond_init (&params.done, NULL); pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE); for(int i=0; i < this->numberOfThread; i++ ){ params.id = i; params.ptr = this; rc = pthread_create(&threads[i], NULL, &(SVAnchor::multichaperWrapper), &params); pthread_cond_wait (&params.done, &params.mutex); } pthread_attr_destroy(&attr); void* status; for(int i=0; i < this->numberOfThread; i++ ) rc = pthread_join(threads[i], &status); pthread_mutex_destroy (&params.mutex); pthread_cond_destroy (&params.done); 如下:

params_t

然后struct params { SVAnchor* ptr; pthread_mutex_t mutex; pthread_cond_t done; int id; }; typedef struct params params_t; 如下:

multichaperWrapper

void* SVAnchor::multichaperWrapper(void* arg){ return (((params*)arg)->ptr)->multichaper( ((params*)arg)); } 如下:

multichaper

答案 4 :(得分:-1)

如果您要做的只是将id传递给调用线程,您可以将其隐藏在pthread_create(&threads[i], NULL, multichaper, (void*)threadID ); 参数中,并且可以移植。像,

$("<a class='action-button' id='pl65197buy' value='buy now' onclick=\"buy(this, 65197, null, 'pl65197qty',null, '/ajax/buy')\">Bekijk aanbieding</a>").prependTo("div#centerplist");