首頁 > 後端開發 > C++ > 如何為從向量呼叫的 C 類成員函數建立線程?

如何為從向量呼叫的 C 類成員函數建立線程?

Patricia Arquette
發布: 2024-12-25 19:53:12
原創
846 人瀏覽過

How to Create Threads for C   Class Member Functions Invoked from a Vector?

為類別成員函數建立執行緒

問題:

當下列情況時,如何為類別成員函數建立執行緒該函數是從類別向量呼叫的實例?

示例代碼和錯誤:

考慮以下代碼:

class c {
    void *print(void *) { std::cout << "Hello"; }
};

std::vector<c> classes;
pthread_t t1;

classes.push_back(c());
classes.push_back(c());

// Attempt to create a thread for c.print()
pthread_create(&t1, NULL, &c[0].print, NULL);

// Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
登入後複製

解釋:

出現該錯誤是因為C類成員函數有一個隱式的this參數,該參數是內部傳遞的。但是,pthread_create() 不會處理這個隱藏參數,導致將成員函數轉換為函數指標時出現類型不符。

解:

有兩種方法對於這個問題:

  1. 使用靜態類method:

此方法沒有this參數,因為它與類別本身關聯,而不是實例。像這樣:

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

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
登入後複製
  1. 使用一個普通的普通函數:

這個方法使用類別定義之外的函數,它可以存取類別及其成員如下:

// Outside the class
void c_print_wrapper(c *c_instance)
{
    c_instance->print();
}

...
c c1, c2;
pthread_t t1;
classes.push_back(c1);
classes.push_back(c2);

// Create the thread for c.print() using wrapper function
pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
登入後複製

以上是如何為從向量呼叫的 C 類成員函數建立線程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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