Dúvidas sobre Sockets, Threads e gerenciamento recursos em servidor C/C++

13. Re: Dúvidas sobre Sockets, Threads e gerenciamento recursos em servidor C/C++

M.
XProtoman

(usa Fedora)

Enviado em 17/07/2015 - 14:57h

paulo1205 escreveu:

Eu nem mesmo vejo no seu programa recurso alocado na thread. Será que o problema está mesmo nela?

De todo modo, o meu ambiente de teste é diferente do seu. Estou usando o Ubuntu 14.04, e compilei os programas usando a opção "-std=c++11" (meu g++ nem suporta c++14). A versão do valgrind é "3.10.0.SVN and LibVEX".

Suas alocações estão usando brk() ou mmap()?

Essas alocações são por causa do for ou por causa do sleep(essas que são perdidas e não liberadas) e talvez até a própria função teste. Se você executar o código sem conteúdo na função teste verá que cancelar a thread não terá qualquer custo para você(provalmente ela tenha terminado antes do delete do main acontecer).


  


14. Re: Dúvidas sobre Sockets, Threads e gerenciamento recursos em servidor C/C++

M.
XProtoman

(usa Fedora)

Enviado em 17/07/2015 - 15:23h

O problema trazendo para sockets é que por exemplo em algum momento posso desconectar um cliente, o jeito mais fácil seria cancelar a thread do cliente porém nesse teste cancelar não libera todos os recursos. Usando isso para outras coisas também não é uma boa opção aparentemente cancelar.


15. Re: Dúvidas sobre Sockets, Threads e gerenciamento recursos em servidor C/C++

Paulo
paulo1205

(usa Ubuntu)

Enviado em 17/07/2015 - 15:35h

XProtoman escreveu:

O problema trazendo para sockets é que por exemplo em algum momento posso desconectar um cliente, o jeito mais fácil seria cancelar a thread do cliente porém nesse teste cancelar não libera todos os recursos. Usando isso para outras coisas também não é uma boa opção aparentemente cancelar.


Nos meus parcos testes, usar RAII (i.e. envelopar gestão de recursos em objetos, para que a chamada do destrutor libere recursos) foi suficiente para não perder recursos. Como mostrei nos testes acima, não vazou a memória de std::vector, nem o descritor (lembre-se que um socket é um descritor) envelopado pela minha raii_fd.

Apesar de extremamente simples, eu não posso ceder a raii_fd (desenvolvi para o meu empregador, logo não é minha de jure, ainda que seja de facto), mas você possivelmente consegue o mesmo efeito (de RAII; em termos de complexidade, nem se compara!) se envelopar o socket com, por exemplo, __gnu_cxx::stdio_filebuf<char>.

Sugiro que você faça testes especificamente com sockets devidamente encapsulados com RAII e veja o que o strace lhe mostra.


16. Re: Dúvidas sobre Sockets, Threads e gerenciamento recursos em servidor C/C++

M.
XProtoman

(usa Fedora)

Enviado em 17/08/2015 - 03:24h

Para ajudar quem deseja fazer sockets em i/o stream:
http://techblog.rajatkhanduja.com/2012/07/converting-file-descriptor-to-io-stream.html

Não testei.

PS: Estou me esquivando de thread por enquanto.



01 02



Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts