pthread_create без отдельной функции - PullRequest
0 голосов
/ 09 июня 2018

У меня есть массив pthread_t s, которые запускаются в цикле for через pthread_create.

У меня есть тонна переменных, которые объявлены заранее и важны для внутренней работы потока.Я хотел бы иметь анонимную внутреннюю функцию в качестве стартовой подпрограммы pthread_create, например, так:

pthread_create(threads[i], NULL, 

     { inner function here }

, NULL);

Я знаю, что в C ++ этого нет, в частности, поэтому я подумал, что, возможно, лямбды могут помочьили, может быть, у кого-то есть другая идея, чтобы мне не нужно было создавать отдельный метод и передавать все те переменные, которые предшествуют pthread_create.

1 Ответ

0 голосов
/ 09 июня 2018

Если лямбда-выражение ничего не захватывает, лямбда-объект можно преобразовать в указатель на функцию C , поэтому будет работать что-то вроде этого:

pthread_t thr;
pthread_create (&thr, NULL,
                [] (void *closure) -> void * {
                  return nullptr;
                }, NULL);

Явный тип возвратаиз void * необходимо, потому что выводимый обычно не будет правильным.Поскольку вы не можете использовать перехваты, вам нужно использовать параметр closure для передачи указателя на объект (и использовать static_cast для приведения его к правильному типу в лямбда-выражении), и по жизненным причинам этовероятно, необходимо выделить это в куче.

(Также обратите внимание, что pthreads[i] в качестве первого элемента для pthread_create выглядит неправильно, это указатель, используемый для возврата части результата, идентификаторановая тема.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...