[英]Using lambda for callback function as C function parameter
我正在為pthread_*
函數編寫自己的std::thread
的包裝器(用於教育目的)。 我想出的構造函數如下所示:
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* {
// ...
};
這個修改是否解決了問題,代碼現在合法嗎?
這個修改是否解決了問題,代碼現在合法嗎?
不,它不能解決問題。 您可以從 lambda 表達式中獲得的 function 指針僅適用於function 與 ZF6F0977C9FDCF8B3C2F 鏈接。
確定獲得指向具有 C 語言鏈接的 function 的指針的方法是使用免費的 function。 這是您將在流行的標准庫實現中看到的方法。 例如, 在 libstdc++
extern "C"
{
static void*
execute_native_thread_routine(void* __p)
{
thread::_State_ptr __t{ static_cast<thread::_State*>(__p) };
__t->_M_run();
return nullptr;
}
// ...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.