Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memanggil Fungsi Ahli Kelas C dengan Selamat daripada Benang?

Bagaimanakah Saya Boleh Memanggil Fungsi Ahli Kelas C dengan Selamat daripada Benang?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-26 16:38:09134semak imbas

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

Memanggil Fungsi Ahli Kelas dalam Benang Dengan Selamat

Dalam bidang multithreading, adalah perkara biasa untuk menghadapi keperluan untuk menggunakan fungsi ahli kelas dalam pelaksanaan urutan. Walau bagaimanapun, tugasan ini boleh memberikan cabaran kerana parameter "ini" tersembunyi dalam fungsi ahli kelas C.

Sebagai contoh, pertimbangkan perkara berikut:

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

Sekarang, mari buat vektor bagi Contoh C:

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

Untuk mencipta urutan yang melaksanakan c.print(), anda mungkin secara intuitif tulis:

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

Walau bagaimanapun, ini akan mengakibatkan ralat:

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

Isu timbul kerana pthread_create() menjangkakan penunjuk fungsi jenis tertentu, manakala c[0] .print ialah penunjuk kepada fungsi ahli dengan parameter "ini" tersembunyi.

Penyelesaian: Menggunakan Kaedah Kelas Statik atau Fungsi Penunjuk

Untuk mengatasi halangan ini, anda mempunyai dua pilihan:

Kaedah Kelas Statik

Kaedah kelas statik tidak mempunyai parameter "ini" dan boleh dipanggil terus tanpa contoh kelas. Begini cara anda boleh melaksanakan kaedah kelas statik untuk fungsi helo:

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

Kemudian, anda boleh mencipta benang menggunakan kaedah kelas statik:

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

Penunjuk Fungsi

Pilihan lain ialah menggunakan penuding fungsi yang merangkum fungsi ahli dan menyediakan parameter "ini" secara eksplisit. Penunjuk fungsi ini kemudiannya boleh digunakan untuk mencipta utas.

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

di mana hello_helper ditakrifkan sebagai:

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

Dengan menggunakan kaedah kelas statik atau penuding fungsi, anda boleh dengan selamat gunakan fungsi ahli kelas dalam urutan, mengelakkan isu parameter "ini".

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Memanggil Fungsi Ahli Kelas C dengan Selamat daripada Benang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn