Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Mencipta Benang untuk Fungsi Ahli Kelas C Dipanggil daripada Vektor?

Bagaimana untuk Mencipta Benang untuk Fungsi Ahli Kelas C Dipanggil daripada Vektor?

Patricia Arquette
Lepaskan: 2024-12-25 19:53:12
asal
910 orang telah melayarinya

How to Create Threads for C   Class Member Functions Invoked from a Vector?

Mencipta Benang untuk Fungsi Ahli Kelas

Masalah:

Bagaimanakah anda membuat urutan untuk fungsi ahli kelas apabila fungsi ini digunakan daripada vektor kejadian kelas?

Contoh Kod dan Ralat:

Pertimbangkan kod berikut:

class c {
    void *print(void *) { std::cout << "Hello"; }
};

std::vector<c> classes;
pthread_t t1;

classes.push_back(c());
classes.push_back(c());

// Attempt to create a thread for c.print()
pthread_create(&t1, NULL, &c[0].print, NULL);

// Error: "cannot convert 'void* (tree_item::*)(void*)' to 'void* (*)(void*)'"
Salin selepas log masuk

Penjelasan:

Ralat berlaku kerana fungsi ahli kelas C mempunyai tersirat parameter ini, yang diluluskan secara dalaman. Walau bagaimanapun, pthread_create() tidak mengendalikan parameter tersembunyi ini, menyebabkan ketidakpadanan jenis apabila menghantar fungsi ahli ke penuding fungsi.

Penyelesaian:

Terdapat dua pendekatan kepada isu ini:

  1. Gunakan kelas statik kaedah:

Kaedah ini tidak mempunyai parameter ini, kerana ia dikaitkan dengan kelas itu sendiri, bukan contoh. Begitu juga:

class C
{
public:
    static void *hello(void *)
    {
        std::cout << "Hello, world!" << std::endl;
        return 0;
    }

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};
...
C c;
pthread_t t;
pthread_create(&t, NULL, &C::hello_helper, &c);
Salin selepas log masuk
  1. Gunakan fungsi biasa biasa:

Kaedah ini menggunakan fungsi di luar definisi kelas, yang boleh mengakses kelas dan ahlinya seperti:

// Outside the class
void c_print_wrapper(c *c_instance)
{
    c_instance->print();
}

...
c c1, c2;
pthread_t t1;
classes.push_back(c1);
classes.push_back(c2);

// Create the thread for c.print() using wrapper function
pthread_create(&t1, NULL, (void *(*)(void *))c_print_wrapper, &classes[0]);
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Mencipta Benang untuk Fungsi Ahli Kelas C Dipanggil daripada Vektor?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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