Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Lulus Fungsi Ahli Kelas C ke pthread_create()?

Bagaimanakah Saya Boleh Lulus Fungsi Ahli Kelas C ke pthread_create()?

Barbara Streisand
Barbara Streisandasal
2024-12-26 01:17:10522semak imbas

How Can I Pass a C   Class Member Function to pthread_create()?

Meluluskan Fungsi Kelas kepada pthread_create()

Mari kita pertimbangkan senario di mana kita mempunyai kelas C yang mengandungi fungsi ahli, "cetak," yang kami mahu laksanakan dalam benang berasingan menggunakan pthread_create(). Walau bagaimanapun, kami mengalami ralat kompilasi:

pthread_create(&t1, NULL, &c[0].print, NULL);

Ralat ini disebabkan oleh fakta bahawa fungsi ahli kelas C secara tersirat mengandungi ini yang menunjuk ke kelas semasa penunjuk sebagai parameter pertamanya. Walau bagaimanapun, pthread_create() menjangkakan penunjuk fungsi standard, yang tidak mempunyai penunjuk ini. Oleh itu, pengkompil tidak boleh menukar penunjuk fungsi sedemikian kepada jenis fungsi yang diperlukan oleh pthread_create().

Penyelesaian

Untuk menyelesaikan masalah ini, kita perlu menggunakan pendekatan alternatif yang membolehkan kita memanggil fungsi ahli kelas daripada pthread_create(). Terdapat dua pendekatan biasa:

Menggunakan kaedah kelas statik

Kaedah kelas statik tidak mengandungi penunjuk ini kerana ia tidak dikaitkan dengan tika kelas tertentu. Ia boleh dipanggil seperti fungsi biasa seperti ini:

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

int main()
{
    pthread_t t;
    pthread_create(&t, NULL, &C::hello, NULL);
    ...
}

Menggunakan fungsi pembalut

Cara lain ialah mencipta fungsi ahli kelas yang dibalut sebagai pembungkus fungsi biasa fungsi. Fungsi pembungkus ini menerima contoh kelas sebagai hujah pertamanya dan memanggil fungsi ahli seperti ini:

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

    static void *hello_helper(void *context)
    {
        return ((C *)context)->hello();
    }
};

int main()
{
    C c;
    pthread_t t;
    pthread_create(&t, NULL, &C::hello_helper, &c);
    ...
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Lulus Fungsi Ahli Kelas C ke pthread_create()?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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