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
Lepaskan: 2024-12-26 16:38:09
asal
169 orang telah melayarinya

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"; }
};
Salin selepas log masuk

Sekarang, mari buat vektor bagi Contoh C:

vector<C> classes;
pthread_t t1;
classes.push_back(C());
classes.push_back(C());
Salin selepas log masuk

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

pthread_create(&t1, NULL, &c[0].print, NULL);
Salin selepas log masuk

Walau bagaimanapun, ini akan mengakibatkan ralat:

cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’ 
Salin selepas log masuk

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; }
};
Salin selepas log masuk

Kemudian, anda boleh mencipta benang menggunakan kaedah kelas statik:

pthread_create(&t, NULL, &C::hello, NULL);
Salin selepas log masuk

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);
Salin selepas log masuk

di mana hello_helper ditakrifkan sebagai:

void *hello_helper(void *context) { return ((C *)context)->hello(); }
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan