首頁 >後端開發 >C++ >如何從執行緒安全地呼叫C類成員函數?

如何從執行緒安全地呼叫C類成員函數?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-26 16:38:09132瀏覽

How Can I Safely Call C   Class Member Functions from Threads?

在執行緒中安全地呼叫類別成員函數

在多執行緒領域,經常會遇到在執行緒執行中呼叫類別成員函數的需要。然而,由於 C 類成員函數中隱藏的「this」參數,此任務可能會帶來挑戰。

例如,考慮以下內容:

class C {
    void *print(void *) { cout << "Hello"; }
};

現在,讓我們建立一個向量C 實例:

vector<C> classes;
pthread_t t1;
classes.push_back(C());
classes.push_back(C());

要建立一個執行 c.print()的線程,您可能會直觀地write:

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

但是,這會導致錯誤:

cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’ 

出現這個問題是因為pthread_create() 需要一個特定類型的函數指針,而c[0] .print 是一個指向帶有隱藏「this」參數的成員函數的指標。

解:使用靜態類別方法或函數指標

要克服這個障礙,你有兩個選擇:

靜態類別方法

靜態類方法沒有「this」參數,可以直接呼叫而無需類別的一個實例。以下是如何為hello 函數實作靜態類別方法:

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

然後,您可以使用靜態類別方法建立執行緒:

pthread_create(&t, NULL, &C::hello, NULL);

函數指標

另一種選擇是使用封裝成員函數並明確提供“this”參數的函數指標。然後可以使用該函數指標建立線程。

C c;
pthread_create(&t, NULL, &C::hello_helper, &c);

其中hello_helper 定義為:

void *hello_helper(void *context) { return ((C *)context)->hello(); }

透過使用靜態類別方法或函數指針,您可以安全地在執行緒內呼叫類別的成員函數,避免「this」參數問題。

以上是如何從執行緒安全地呼叫C類成員函數?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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