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
846 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!

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