Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Memanggil Fungsi Ahli Kelas C dengan Selamat daripada Benang?
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.
Untuk mengatasi halangan ini, anda mempunyai dua pilihan:
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);
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!