Meluluskan Fungsi Kelas kepada pthread_create()
Mari kita pertimbangkan senario di mana kita mempunyai kelas C yang mengandungi fungsi ahli, "cetak," yang kami mahu laksanakan dalam benang berasingan menggunakan pthread_create(). Walau bagaimanapun, kami mengalami ralat kompilasi:
pthread_create(&t1, NULL, &c[0].print, NULL);
Ralat ini disebabkan oleh fakta bahawa fungsi ahli kelas C secara tersirat mengandungi ini yang menunjuk ke kelas semasa penunjuk sebagai parameter pertamanya. Walau bagaimanapun, pthread_create() menjangkakan penunjuk fungsi standard, yang tidak mempunyai penunjuk ini. Oleh itu, pengkompil tidak boleh menukar penunjuk fungsi sedemikian kepada jenis fungsi yang diperlukan oleh pthread_create().
Penyelesaian
Untuk menyelesaikan masalah ini, kita perlu menggunakan pendekatan alternatif yang membolehkan kita memanggil fungsi ahli kelas daripada pthread_create(). Terdapat dua pendekatan biasa:
Menggunakan kaedah kelas statik
Kaedah kelas statik tidak mengandungi penunjuk ini kerana ia tidak dikaitkan dengan tika kelas tertentu. Ia boleh dipanggil seperti fungsi biasa seperti ini:
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); ... }
Menggunakan fungsi pembalut
Cara lain ialah mencipta fungsi ahli kelas yang dibalut sebagai pembungkus fungsi biasa fungsi. Fungsi pembungkus ini menerima contoh kelas sebagai hujah pertamanya dan memanggil fungsi ahli seperti ini:
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); ... }
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Lulus Fungsi Ahli Kelas C ke pthread_create()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!