es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Error al pasar argumentos a pthread_create()

Estoy tratando de crear una estructura similar a un Thread-Pool para pthread para realizar trabajos idénticos para programación de red, lo cual es muy similar a esta pregunta. Sin embargo, surgió un problema cuando intenté pasar los argumentos del método init() a pthread_create().

Código

“`c++
class ThreadPool{
public:
BlockingQueue socket<em>bq;
pthread</em>mutex<em>t* threads[THREAD</em>NUM]; // almacenar el puntero de los threads

<pre><code> ThreadPool();
void init(pthread_attr_t* attr, void<em>start_routine(void</em>), void* arg);
</code></pre>

};

void ThreadPool::init(pthread<em>attr</em>t* attr, void<em>start_routine(void</em>), void* arg){
// crear threads
for(int i = 0; i < THREAD<em>NUM; i++){
if(pthread</em>create(threads[i], attr, start_routine, arg)!=0){
fprintf(stderr, "Thread Pool Init: falied when creatng threads");
exit(1);
}
}
}
“`

Mensaje de error

ninguno
error: no hay función coincidente para 'pthread_create'
if(pthread_create(threads[i], attr, start_routine, arg)!=0){
^~~~~~~~~~~~~~
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/pthread.h:329:5: nota: función candidata no viable: no hay conversión conocida de 'pthread_mutex_t *' (también conocido como '_opaque_pthread_mutex_t *') a 'pthread_t _Nullable * _Nonnull' (también conocido como '_opaque_pthread_t **') para el primer argumento
int pthread_create(pthread_t _Nullable * _Nonnull __restrict,
^
1 error generado.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    El mensaje de error indica que no hay una función coincidente para pthread_create() que tome los argumentos que estás pasando. El problema parece estar en el primer argumento de pthread_create(), que espera un puntero a una variable pthread_t, pero en su lugar estás pasando un puntero a una variable pthread_mutex_t.

    Para solucionar este problema, necesitas cambiar el tipo del arreglo threads de pthread_mutex_t* a pthread_t*. Esto te permitirá pasar correctamente la dirección de cada variable pthread_t a pthread_create(). Aquí está el código actualizado:

    “`c++
    class ThreadPool{
    public:
    BlockingQueue socket_bq;
    pthread_t* threads[THREAD_NUM]; // store the pointer of threads

        ThreadPool();
        void init(pthread_attr_t* attr, void*start_routine(void*), void* arg);
    

    };

    void ThreadPool::init(pthread_attr_t* attr, voidstart_routine(void), void* arg){
    // create threads
    for(int i = 0; i < THREAD_NUM; i++){
    if(pthread_create(threads[i], attr, start_routine, arg)!=0){
    fprintf(stderr, “Thread Pool Init: falied when creatng threads”);
    exit(1);
    }
    }
    }
    “`

    Con este cambio, pthread_create() recibirá los argumentos correctos y tu código debería funcionar como se espera.

Comments are closed.