簡體   English   中英

使用 lambda 進行回調 function 作為 C ZC1C425268E68385D1AB5074F14ZA 參數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM