C ++, создать pthread для функции с возвращаемым типом? - PullRequest
1 голос
/ 27 января 2012

Скажите, у меня есть следующая функция:

bool foo (int a); // This method declaration can not be changed.

Как мне создать pthread для этого? И как мне узнать, что вернула функция? Я посмотрел в Интернете, и кажется, что любая функция, для которой я хочу создать pthread, должна принимать void* в качестве аргумента и также должна возвращать void*, и я не совсем уверен, как приведение всех этих слов будет работать, или где я получу возвращенный бул.

Я новичок в C ++, поэтому, пожалуйста, потерпите меня =)

Ответы [ 4 ]

5 голосов
/ 27 января 2012

Поскольку вы имеете дело только с bools (которые на самом деле являются целыми числами), возможно, но не рекомендуется приводить функцию к типу функции pthread, так как указатель совместим с (некоторыми) целочисленными типами :

pthread_t pid;
pthread_create(&pid, NULL, (void *(*)(void *))foo, (void *)argument));

Однако вам лучше обернуть вашу функцию в другую, pthread-совместимую, а затем вернуть указатель на возвращаемое значение (должно быть free () d после использования):

void *foo_wrapper(void *arg)
{
    int a = *(int *)arg;
    bool retval = foo(a);
    bool *ret = malloc(sizeof(bool));
    *ret = retval;
    return ret;
}

затем используйте:

pthread_t pid;
pthread_create(&pid, NULL, foo_wrapper, &a);

С помощью этого метода в будущем вы сможете вызывать функцию с произвольным типом возвращаемого значения или аргумента.

1 голос
/ 27 января 2012

Вы можете инкапсулировать функцию, которую вы хотите вызвать, в объект функции, а затем вызвать этот объект функции из вашей функции pthread:

Сначала определите объект функции, который инкапсулирует ваш вызов функции.

struct foo_functor {
    // Construct the object with your parameters
    foo_functor(int a) : ret_(), a_(a) {}

    // Invoke your function, capturing any return values.
    void operator()() {
        ret_ = foo(a_);
    }

    // Access the return value.
    bool result() {
        return ret_;
    }

private:
    bool ret_;
    int a_;
};

Во-вторых, определите функцию с соответствующей сигнатурой pthread, которая будет вызывать ваш функциональный объект.

// The wrapper function to call from pthread. This will in turn call 
extern "C" {
    void* thread_func(void* arg) {
        foo_functor* f = reinterpret_cast<foo_functor*>(arg);
        (*f)();
        return 0;
    }
}

Наконец, создайте экземпляр вашего функционального объекта и передайте его в качестве параметра функции thread_func.

foo_functor func(10);

pthread_t pid;
pthread_create(&pid, NULL, thread_func, &func);
pthread_join(pid, NULL);

bool ret = func.result();
0 голосов
/ 27 января 2012

Bool функционально эквивалентен int. false - это (обычно) 0, а true - что-нибудь еще. Таким образом

void *foo(void *a){
  int *a_int = (int *)a;
  //do things
  bool *x = new bool;
  *x = answer; 
  pthread_exit(x);
}

Тогда в вашем главном вы получите возвращенный результат, приведя его обратно к bool.

bool *x; 
pthread_join(thread,(void *)x);
//Answer is *x
0 голосов
/ 27 января 2012

Обходной путь - использовать void * foo (int a, bool & b).

...