"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo puedo llamar de forma segura a las funciones de miembros de la clase C ++ desde los hilos?

¿Cómo puedo llamar de forma segura a las funciones de miembros de la clase C ++ desde los hilos?

Publicado el 2025-03-04
Navegar:564

How Can I Safely Call C   Class Member Functions from Threads?

llamando a las funciones de miembros de la clase en hilos de forma segura

En el reino de Multithreading, es común encontrar la necesidad de invocar las funciones de los miembros de una clase dentro de la ejecución del hilo. Sin embargo, esta tarea puede presentar desafíos debido al parámetro oculto "este" en las funciones del miembro de la clase C.

, por ejemplo, considere lo siguiente:

class C {
    void *print(void *) { cout  

ahora, creemos un vector de instancias c:

vector classes;
pthread_t t1;
classes.push_back(C());
classes.push_back(C());

To create a thread that executes c.print(), you might intuitively write:

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

However, this will result in an error:

cannot convert ‘void* (tree_item::*)(void*)’ to ‘void* (*)(void*)’ 
El problema surge porque pthread_create () espera un puntero de funciones de un tipo específico, mientras que c [0] .print es un puntero a un miembro de un miembro con una función de la función de" Pointer

Para superar este obstáculo, tiene dos opciones:

Método de clase estática

Un método de clase estática no tiene un parámetro "este" y puede llamarse directamente sin una instancia de la clase. Así es como podría implementar un método de clase estática para la función Hello:

clase C { público: void estático *Hello (void *) {std :: cout Entonces, puede crear un hilo usando el método de clase estática:
class C {
public:
    static void *hello(void *) { std::cout  pthread_create (& t, null, & c :: hello, null); 

function pointer
pthread_create(&t, NULL, &C::hello, NULL);

c c; pthread_create (& t, null, & c :: hello_helper, & c);

donde hello_helper se define como:

C c;
pthread_create(&t, NULL, &C::hello_helper, &c);

mediante el uso de un método de clase estática o un puntero de funciones, puede invocar con seguridad las funciones de los miembros de una clase dentro de un hilo, evitando el problema de parámetros "este".

Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3