我正在为函数编写自己的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函数的调用约定,传递start_fn
函数指针pthread_create
可以是UB。这个答案似乎证实了这一点。
进一步挖掘,我发现了这个问题。按照公认答案的精神,我将代码更改为:
extern "C" using Thread_start_fn = void* (void*);
Thread_start_fn* start_fn = [](void* invoker_ptr) -> void* {
// ...
};
这个修改是否解决了问题,代码现在合法吗?