Я писал свою собственную std::thread
-подобную оболочку для pthread_*
функций (в образовательных целях). Конструктор, который я придумал, выглядел так:
template<class Fn, class... Args>
explicit Thread(Fn&& fn, Args&&... args) {
using Invoker = Thread_invoker<Fn, Args...>;
void* (* start_fn)(void*) = [](void* invoker_ptr) -> void* {
// ...
};
auto invoker = std::make_unique<Invoker>(/* ... */);
const auto err = ::pthread_create(&handle_, nullptr, start_fn, invoker.get());
// ...
invoker.release();
}
Я сделал несколько базовых c тестов, код работает. Но потом мне пришло в голову, что функции C ++ теоретически могут иметь соглашения о вызовах, отличные от C функций, и передача указателя функции start_fn
на pthread_create
может быть UB. Этот ответ , кажется, подтверждает это.
Копая дальше, я нашел этот вопрос . Следуя духу принятого ответа , я изменил свой код следующим образом:
extern "C" using Thread_start_fn = void* (void*);
Thread_start_fn* start_fn = [](void* invoker_ptr) -> void* {
// ...
};
Решает ли это изменение проблему и является ли код законным в настоящее время?