Rumah > pembangunan bahagian belakang > C++ > Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C dalam pthreads?

Bagaimanakah Saya Boleh Menggunakan Fungsi Ahli Kelas C dalam pthreads?

Barbara Streisand
Lepaskan: 2024-12-23 04:29:20
asal
330 orang telah melayarinya

How Can I Use C   Class Member Functions in pthreads?

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

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:

  1. 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();
        }
    };
    Salin selepas log masuk
  2. 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();
    }
    Salin selepas log masuk

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(&amp;t, NULL, &amp;C::hello_helper, &amp;c);  // Static Class Method

pthread_create(&amp;t, NULL, &amp;hello_wrapper, &amp;c);  // Wrapper Function
Salin selepas log masuk

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!

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