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>