Menggabungkan Fungsi Ahli Kelas ke dalam Benang
Dalam C , fungsi ahli kelas sememangnya membawa parameter tersembunyi yang dikenali sebagai "ini." Ini menimbulkan cabaran apabila cuba mencipta utas menggunakan fungsi ahli, kerana fungsi pthread_create() perpustakaan standard mengharapkan penuding fungsi tanpa parameter sedemikian.
Ralat Penyusunan: Tidak Dapat Menukar Penunjuk Fungsi
Seperti yang digambarkan oleh coretan kod awal, cuba menghantar fungsi ahli kelas kepada pthread_create() secara langsung membawa kepada ralat penyusunan:
pthread_create(&t1, NULL, &c[0].print, NULL);
Pengkompil mengadu bahawa ia tidak boleh menukar penuding fungsi ahli (void* (tree_item::*)(void*)) kepada jenis penuding fungsi yang dijangkakan (void* (*)(void*)).
Penyelesaian: Kaedah Kelas Statik atau Bebas Fungsi
Untuk memintas isu ini, terdapat dua pendekatan yang berdaya maju:
Kaedah Kelas Statik:
Tentukan kelas statik kaedah (yang tidak menerima penunjuk "ini") yang merangkum yang dikehendaki fungsi:
class C { public: void *hello(void) { std::cout << "Hello, world!" << std::endl; return 0; } static void *hello_helper(void *context) { return ((C *)context)->hello(); } };
Fungsi Bebas:
Buat fungsi berasingan yang berfungsi sebagai pembalut di sekeliling fungsi ahli kelas, secara eksplisit menghantar "ini "penunjuk sebagai hujah:
void hello_wrapper(void *context) { C *object = (C *)context; object->print(); }
Penciptaan Benang Menggunakan Kaedah Kelas Statik atau Fungsi Pembungkus
Dengan salah satu pendekatan ini, anda kini boleh menggunakan pthread_create( ) untuk mencipta benang yang akan melaksanakan fungsi ahli kelas yang dikehendaki:
C c; pthread_create(&t, NULL, &C::hello_helper, &c); // Static Class Method pthread_create(&t, NULL, &hello_wrapper, &c); // Wrapper Function
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C dalam pthreads?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!