首頁 > 後端開發 > C++ > 如何在 pthread 中使用 C 類別成員函數?

如何在 pthread 中使用 C 類別成員函數?

Barbara Streisand
發布: 2024-12-23 04:29:20
原創
328 人瀏覽過

How Can I Use C   Class Member Functions in pthreads?

將類別成員函數合併到執行緒中

在C 中,類別成員函數本質上帶有一個稱為「this」的隱藏參數。這在嘗試使用成員函數建立執行緒時帶來了挑戰,因為標準函式庫的 pthread_create() 函數需要一個沒有此類參數的函數指標。

編譯錯誤:無法轉換函數指標

如初始程式碼片段所示,嘗試將類別成員函數傳遞給pthread_create() 會直接導致編譯錯誤:

pthread_create(&t1, NULL, &c[0].print, NULL);
登入後複製

編譯器抱怨它無法將成員函數指標(void* (tree_item::*)(void*)) 轉換為預期的函數指標型別 (void* (*)(void *)).

解:靜態類別方法或獨立函數

要規避此問題,有兩種可行的方法:

  1. 靜態類別方法:
    定義一個封裝靜態類別方法(不接受“ this」指標)所需功能:

    class C
    {
    public:
        void *hello(void)
        {
            std::cout << "Hello, world!" << std::endl;
            return 0;
        }
    
        static void *hello_helper(void *context)
        {
            return ((C *)context)->hello();
        }
    };
    登入後複製
  2. 獨立函數:
    建立一個單獨的函數,作為類別成員函數的包裝器,顯式傳入「this」指標作為參數:

    void hello_wrapper(void *context)
    {
        C *object = (C *)context;
        object->print();
    }
    登入後複製

使用靜態類別方法或包裝函數建立執行緒

透過這兩種方法中的任何一種,您現在可以使用pthread_create() 建立將執行所需的類別成員函數的執行緒:

C c;
pthread_create(&amp;t, NULL, &amp;C::hello_helper, &amp;c);  // Static Class Method

pthread_create(&amp;t, NULL, &amp;hello_wrapper, &amp;c);  // Wrapper Function
登入後複製

以上是如何在 pthread 中使用 C 類別成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板