Mencipta Benang pada Fungsi Ahli Kelas
Apabila bekerja dengan kelas C, cabaran biasa ialah mencipta urutan pada fungsi ahli. Pertimbangkan kelas berikut:
class c { // ... void *print(void *){ cout << "Hello"; } }
Katakan kita mempunyai vektor objek c dan ingin mencipta benang pada fungsi c.print(). Walau bagaimanapun, kod berikut membawa kepada ralat:
pthread_create(&t1, NULL, &c[0].print, NULL);
Mesej ralat menunjukkan bahawa penuding fungsi tidak sepadan dengan jenis yang dijangkakan untuk argumen ketiga pthread_create().
Penyelesaian:
Ralat berlaku kerana fungsi ahli kelas C mempunyai parameter tersembunyi yang diluluskan secara tersirat. pthread_create() tidak tahu contoh c untuk digunakan untuk parameter ini. Untuk menyelesaikan masalah ini, kita perlu menggunakan kaedah kelas statik (yang tidak mempunyai parameter ini) atau fungsi biasa untuk bootstrap kelas.
Pendekatan Kaedah Kelas Statik:
class C { public: static void *hello_helper(void *context) { return ((C *)context)->hello(); } }; // ... C c; pthread_t t; pthread_create(&t, NULL, &C::hello_helper, &c);
Pendekatan ini mentakrifkan kaedah kelas statik hello_helper(), yang tidak mempunyai parameter ini dan membungkus panggilan kepada ahli hello() fungsi.
Pendekatan Fungsi Biasa:
void hello(void *context) { C *c = (C *)context; c->hello(); } // ... C c; pthread_t t; pthread_create(&t, NULL, &hello, &c);
Di sini, kami mentakrifkan fungsi biasa hello() yang mengambil penuding kosong yang melaluinya dan menghantarnya ke contoh c. Kami kemudian memanggil fungsi ahli hello() pada contoh c.
Atas ialah kandungan terperinci Bagaimana untuk Mencipta Benang dengan Betul untuk Fungsi Ahli Kelas C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!