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

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