首頁 >後端開發 >C++ >如何將 C 類別成員函數傳遞給 pthread_create()?

如何將 C 類別成員函數傳遞給 pthread_create()?

Barbara Streisand
Barbara Streisand原創
2024-12-26 01:17:10519瀏覽

How Can I Pass a C   Class Member Function to pthread_create()?

Passing Class Functions to pthread_create()

Let's consider a scenario where we🎜>

Let's consider a scenario where we🎜>

Let's consider a scenario where we have a C unc containing a mprint" which we want to execute in a separate thread using pthread_create().然而,我們遇到了一個編譯錯誤:

pthread_create(&t1, NULL, &c[0].print, NULL);

的原因

此錯誤是由於 C類別成員函數隱含包含一個指向目前類別的 this 指標作為其第一個參數。然而,pthread_create() 期望一個標準函數指針,它沒有 this 指針。因此,編譯器無法將此類函數指標轉換為 pthread_create() 所需的函數類型。

解決方案

為了解決這個問題,我們需要採用一種替代方法,讓我們可以從pthread_create() 中呼叫類別成員函數。有兩種常見的方法:

使用靜態類別方法

class C
{
public:
    static void *hello(void)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }
};

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, &C::hello, NULL);
    ...
}
靜態類別方法不包含 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();
    }
};

int main()
{
    C c;
    pthread_t t;
    pthread_create(&t, NULL, &C::hello_helper, &c);
    ...
}
另一種方法是建立將類別成員函數包裝為普通函數的包裝函數。這個包裝函數接受類別實例作為其第一個參數,並呼叫成員函數,如下所示:

以上是如何將 C 類別成員函數傳遞給 pthread_create()?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn