0

Estoy haciendo un chat con sockets en c++ mediante hilos. Total, que tengo incluido todas las librerias necesarias, pero en una funcion que tengo para cancelar los hilos, uso el metodo "pthread_cancel", cuando lo compilo me sale el siguiente error :

CMakeFiles/Socket.dir/main.cpp.o: In function `request_cancellation(std::thread&)':
/home/k1k4ss0/CLionProjects/Socket/main.cpp:111: undefined reference to `pthread_cancel'
CMakeFiles/Socket.dir/main.cpp.o: In function `std::thread::thread<void (*)(Socket&, sockaddr_in, std::__exception_ptr::exception_ptr&), std::reference_wrapper<Socket>, std::reference_wrapper<sockaddr_in>, std::reference_wrapper<std::__exception_ptr::exception_ptr> >(void (*&&)(Socket&, sockaddr_in, std::__exception_ptr::exception_ptr&), std::reference_wrapper<Socket>&&, std::reference_wrapper<sockaddr_in>&&, std::reference_wrapper<std::__exception_ptr::exception_ptr>&&)':
/usr/include/c++/7/thread:122: undefined reference to `pthread_create'
collect2: error: ld returned 1 exit status

Las lineas a las que hacen referencia son las siguientes:

void request_cancellation(std::thread& thread) {



       int cancelar=pthread_cancel(thread.native_handle());  // native handle se usa para obtener el manejador interno de tipo "pthread_t" codigo dado

        if(cancelar!=0){

            throw std::system_error(errno,std::system_category(),"El hilo no se ha podido cancelar");
        }
        else{
            std::cout<<"Hilo eliminado correctamente"<<std::endl;

        }




}

La 111, donde tengo mi funcion para la cancelacion de hilos

Los hilos los creo de la siguiente forma :

std::thread *hilo1,*hilo2;

Y son llamados en las siguientes lineas:

Manejador de señales:

 ....
if (signum == SIGINT) {
    std::cout << "¡Señal SIGINT interceptada!" << std::endl;
    request_cancellation(*hilo2);
    quick_exit(EXIT_SUCCESS);  // exit pero para hilos

}
 .....

Y en el main:

....

        try{
            std::cout<<"Puerto a conectar: "<<puerto<<std::endl;
            sockaddr_in  local=make_ip_address("127.0.0.1", puerto);                    // usamos el puerto especificado con nuestra direccion local
            sockaddr_in  destino=make_ip_address(ip_server, 1);                         // usarmos la direccion especificada, con el puerto 1

            Socket here(local);                   // socket con la direccion local


            std::exception_ptr eptr1{};
             hilo1 = new std::thread(&enviar,std::ref(here),std::ref(destino),std::ref(eptr1));        // para especificar los parametros de enviar(...), hay que usar std::ref(parametro)



            std::exception_ptr eptr2{};
             hilo2 = new std::thread(&recibir,std::ref(here),std::ref(destino),std::ref(eptr2));



            while (!quit);                                                              // hacemos bucles infinitos  hasta que se tenga que terminar aka quit==true
            request_cancellation(*hilo1);   // mandamos a terminar el hilo 1             // llamamos a terminar los dos hilos
            request_cancellation(*hilo2);   // mandamos a terminar el hilo 2
            hilo1->join();    // Bloquear el hilo principal hasta que hilo1 termine      // obligamos al hilo principal a esperar que estos dos terminen
            hilo2->join();    // Bloquear el hilo principal hasta que hilo2 termine



            if(eptr1){
                std::rethrow_exception(eptr1);

            }


            if(eptr2){
                std::rethrow_exception(eptr2);

            }




        }
        catch(std::bad_alloc& e){
            std::cerr<<"mytalk :"<<": memoria insuficionte\n";
            return 1;

        }
        catch(std::system_error& e){
            std::cerr <<"mytalk" << ":" <<e.what()<<'\n';
            return 2;

        }

Las librerias que estoy usando son las siguientes:

include

#include <cstdio>
#include "Socket.h"
#include <thread>
#include <exception>
#include <atomic>
#include <cstring>
#include <vector>
#include <system_error>
#include <pthread.h>
#include <csignal>
#include <unistd.h>
#include <getopt.h>
k1k4ss0
  • 659
  • 4
  • 12
  • 1
    Posible duplicado de [Simbolo externo sin resolver ¿Qué he hecho mal?](https://es.stackoverflow.com/questions/65557/simbolo-externo-sin-resolver-qu%c3%a9-he-hecho-mal) – Trauma Jan 11 '19 at 18:21
  • Hola, gracias, ya vi que es lo que andaba mal, al compilar necesitaba agregar "-pthread", y con eso ya compila... – k1k4ss0 Jan 11 '19 at 20:06

1 Answers1

0

resulta que todo estaba bien, al compilar tenia que escribir "-ptrhead", quedando asi:

 g++ [mis archivos .cpp] -pthread
k1k4ss0
  • 659
  • 4
  • 12