std::thread me esta superado.

Estado
Cerrado para nuevas respuestas.

Mannakia

Programador
Ex-Staff
Bueno, ya me recorri google bing, ask(? buscando este problema pero no encuentro solucion, lo unico que encuentro son soluciones al problema pero generados por otras fuentes.

El problema es que me tira Segmentation fault en el contructor std::thread. Estuve debugeando el error, porque le explico que primero me crea un monto de threads, no distingo bien que ocaciona que falle si por lo general el funciona correctamente TODO. Tengo hipotesis como sobrecarga de threads(pero debugeando en el momento que tira error hay pocos threads hecho -50), la otra hiposis es algun error de argumento pero sin embargo funciona normalmente siempre, otra hipotesis( no tengo mas memoria) tampoco la verdad no se.

Les dejo datos, sources e screenshots.

C++:
    while (true){
        res = accept(serverSocket, (sockaddr*) &client, &sizeOfClient);
 
        if (res != -1){
            ClientListener *newClient = new ClientListener();
 
            if (!newClient->connect(res, client.sin_addr.s_addr)){
                std::cout << "error with newClient->connect()" << std::endl;
                //delete newClient;
            }
        }
    }
C++:
bool ClientListener::connect(int socket, int ip){
    this->socket = socket;
    this->connected = true;
    memcpy(&this->ip[0], &ip, 4);
 
    bool threadCreated = false;
 
    //pthread_t th;
    //int r = pthread_create(&th, NULL, thCaller, (void*)this);
 
    std::cout << "created thread >" << r << std::endl ;
 
    try{
        std::cout << "creating thread >";
        this->threadRead = new std::thread(&ClientListener::readData, this);
        std::cout << " ok" << std::endl;
        threadCreated = true;
    }catch(std::system_error &e){
        threadCreated = false;
    }
 
    return threadCreated;
}
Screenshot, con el stack, runingthreads.


NOTA: Es obvio que es C++11


PD: NO LE PRESTEN ATENCION AL CODIGO ASCO, solo a lo que funciona mal.
 

song

Newbie Lvl 6
En definitiva es a ésto lo que lleva la programación multi-hilo, yo optaría por otro paradigma, y más si estás implementando un servidor.
 

0xDEADBEEF

Vicinity of obscenity
Ex-Staff
Mmmmh...

Que es exactamente lo que quieres hacer?

Que dato es ClientListener::readData?

Y por otra parte, seguramente puedes implementarlo con herencia y metodos virtuales, seguro! Sin necesidad de pasar punteroa función.

Por ultimo, no sirve hilo por user, esa estrategia no es escalable pero bueno, mientras tanto puedes probar a utilizarla xD

Sobre tu codigo... revisa esto:
http://www.cplusplus.com/reference/thread/thread/

Segun dice la doc, estás pasandole a la función readData de la cual no puedo ver el cuerpo, un puntero a la clase actual, por lo tanto entre parámetros deberás tener TuClase * Ptr, o algo similar.

Además, no utilices new si no es necesario, y utiliza joint para lanzar el hilo.

song dijo:
En definitiva es a ésto lo que lleva la programación multi-hilo, yo optaría por otro paradigma, y más si estás implementando un servidor.
WTF?
 

Mannakia

Programador
Ex-Staff
song dijo:
En definitiva es a ésto lo que lleva la programación multi-hilo, yo optaría por otro paradigma, y más si estás implementando un servidor.
Algun sugerencia?

PARRA:
QUe me sugeris en vez de Thread por usuario? No conozco muchas alternativas. Estoy convenciendome que el error es la cantidad de threads solicitados al sistema por tiempo :p

Saluidos
 

0xDEADBEEF

Vicinity of obscenity
Ex-Staff
Mannakia dijo:
song dijo:
En definitiva es a ésto lo que lleva la programación multi-hilo, yo optaría por otro paradigma, y más si estás implementando un servidor.
Algun sugerencia?

PARRA:
QUe me sugeris en vez de Thread por usuario? No conozco muchas alternativas. Estoy convenciendome que el error es la cantidad de threads solicitados al sistema por tiempo :p

Saluidos
Na! Pasa todo el codigo, eso parece más un error de memoria, estás haciendo alguna cosa mal. Pero no tengo suficiente informacion para saber el que.

Yo ahora en AOC uso hilo por usuario, pero no es una buena opción, nada más pueda lo voy a reemplazar por kqueue para unix y iocp para win.

Si no quieres reinventar la rueda, te recomiendo que utilices libevent (http://libevent.org/). Es una herramienta muy poderosa, que implementa este tipo de algoritmos, abstrayendote del sistema operativo.

Como puedes ver en los tests, es realmente escalable:
http://alacner.com/book/libevent/libevent-benchmark.jpg

Esto es muchísimo más eficiente. La idea de thread por user no es mala, pero el problema es que para poder lanzar la aplicacion necesitas un cluster, si quieres que sea escalable, que pueda aguantar esa cantidad de hilos. Como los servidores normales, aunque sean pepinos, no tienen capacidad para manejar tanta cantidad de hilos, esta opción es mucho mejor y escalable.

Se trata de async i/o, donde recibes asincronicamente interrupciones del hardware, manejadas de una manera muy eficiente que dan un overhead mínimo a el servidor. Esto permite escalar a miles de conexiones.

Aqui tienes más info sobre el tema: http://en.wikipedia.org/wiki/C10k_problem
 
W

Wolftein

Invitado
Usa un lambda para ver si realmente esta el error dentro del constructor. Segmentation fault significa que tenes un puntero que esta apuntando a una memoria invalida y la estas llamando.

C++:
this->threadRead = new std::thread([]()
{
   printf("Dentro<span style="color: #666666; font-weight: bold;">\n"</span>);
   readData();
});
Como dijo Parra, crear una thread por cliente no es recomendable. Para empezar deberias hacerlo con "Selectores".
Ejemplo https://github.com/LaurentGomila/SFML/b ... lector.hpp
 

song

Newbie Lvl 6
Mi comentario iba a lo que ya comentaron Parra y Wolftein. Por la misma razón que nginx (usando procesos y programación dirigida a eventos) escala muchísimo más que Apache (threads).

P.D: eso es Lubuntu?
 
W

Wolftein

Invitado
song dijo:
Mi comentario iba a lo que ya comentaron Parra y Wolftein. Por la misma razón que nginx (usando procesos y programación dirigida a eventos) escala muchísimo más que Apache (threads).

P.D: eso es Lubuntu?
Ni hablar de NodeJS.
 
Estado
Cerrado para nuevas respuestas.
Arriba