我正在编写类似于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
可能会导致未定义行为。 这个答案 似乎证实了这一点。进一步查找,我发现这个问题。遵循被接受的答案的精神,我将我的代码改成了这样:
extern "C" using Thread_start_fn = void* (void*);
Thread_start_fn* start_fn = [](void* invoker_ptr) -> void* {
// ...
};
这个修改是否解决了问题并使代码合法?