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.
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 depthread_create()
, que espera un puntero a una variablepthread_t
, pero en su lugar estás pasando un puntero a una variablepthread_mutex_t
.Para solucionar este problema, necesitas cambiar el tipo del arreglo
threads
depthread_mutex_t*
apthread_t*
. Esto te permitirá pasar correctamente la dirección de cada variablepthread_t
apthread_create()
. Aquí está el código actualizado:“`c++
class ThreadPool{
public:
BlockingQueue socket_bq;
pthread_t* threads[THREAD_NUM]; // store the pointer of threads
};
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.