Boa tarde pessoal,
estou com o seguinte problema em meu codigo C++,
resumindo tenho 2 ou mais threads removendo dados de uma queue, para isso tenho que usar algum tipo de lock, foi quando eu lembrei do mutex (ou semaforo) entao implementei da seguinte maneira.
porem quando a primeira thread libera com o unlock, a segunda nao entra no lock, ela fica travada por um tempo, ou seja, nao esta sendo instantâneo…alguem sabe como eu posso fazer isso corretamente?!
[quote=Sad7]Boa tarde pessoal,
estou com o seguinte problema em meu codigo C++,
resumindo tenho 2 ou mais threads removendo dados de uma queue, para isso tenho que usar algum tipo de lock, foi quando eu lembrei do mutex (ou semaforo) entao implementei da seguinte maneira.
porem quando a primeira thread libera com o unlock, a segunda nao entra no lock, ela fica travada por um tempo, ou seja, nao esta sendo instantâneo…alguem sabe como eu posso fazer isso corretamente?!
Grato.[/quote]
Sua expectativa não está de acordo com a especificação dessa API.
A API não garante que uma thread esperando pelo mutex receberá tempo de processamento instantaneamente após o mutex ser destravado.
Quando, como e porquê uma thread recebe tempo de processamento é ditado pela política de escalonamento do sistema, que pode variar de implementação para implementação.
Seria bom também usar RAII nos mutexes. Senão uma exception disparada no meio desse código poderá impedir que o unlock seja chamado (ou um programador mais desatento pode inadvertidamente inserir um return ali no meio).
Agora, para isso você vai acabar criando uma classe Mutex, que é o que a boost já faz… por isso, volto a insistir que use a boost ao invés do pThreads diretamente.
[quote=ViniGodoy]Seria bom também usar RAII nos mutexes. Senão uma exception disparada no meio desse código poderá impedir que o unlock seja chamado (ou um programador mais desatento pode inadvertidamente inserir um return ali no meio).
Agora, para isso você vai acabar criando uma classe Mutex, que é o que a boost já faz… por isso, volto a insistir que use a boost ao invés do pThreads diretamente.[/quote]
Entao vou estudar melhor a boost, o que eu preciso eh perfmormace e segurança, e se voce disse q eh melhor irei trocar…
Valeu Vini.
Na verdade, a boost é uma biblioteca excelente com muita coisa. Vale a pena estuda-la a fundo. E ela é feita pelo mesmo comitée que cria o C++. Tudo de altíssima qualidade, performance e praticamente oficial.
E o melhor, tem uma documentação simplesmente excelente.
Na verdade, a boost é uma biblioteca excelente com muita coisa. Vale a pena estuda-la a fundo. E ela é feita pelo mesmo comitée que cria o C++. Tudo de altíssima qualidade, performance e praticamente oficial.
E o melhor, tem uma documentação simplesmente excelente.[/quote]
Eu dei uma olhada na parte de threads somente, irei verificar mais a fundo essa biblioteca.
Vo tentar implementar a parte de log.
Qualquer coisa eu grito aee…valeu mesmo cara.
No seu caso (em que você quer esperar 2 threads terminarem), o correto em boost::thread é usar o “barrier” que é feito justamente para isso (você inicia N threads, e quer esperar por todas terminarem, ou pelo menos M delas terminarem, etc.) da forma mais eficiente que houver no seu sistema operacional. (No seu caso, você está esperando a thread 1 terminar e depois a 2, mas com barriers você poderia ter algo como esperar a 1 e a 2 terminarem = tanto faz quem terminar primeiro, a 2 ou a 1, que você teria a condição correta.
Uma vantagem de usar a boost é que seu programa fica bem mais fácil de portar para o Windows (ou vice-versa, portar um programa Windows para o Unix/Linux). Onde estou trabalhando há um projeto de portar um serviço do Windows para o Linux, que será possível porque ele foi escrito usando principalmente as bibliotecas do Boost.
[quote]
No seu caso (em que você quer esperar 2 threads terminarem), o correto em boost::thread é usar o “barrier” que é feito justamente para isso (você inicia N threads, e quer esperar por todas terminarem, ou pelo menos M delas terminarem, etc.) da forma mais eficiente que houver no seu sistema operacional. (No seu caso, você está esperando a thread 1 terminar e depois a 2, mas com barriers você poderia ter algo como esperar a 1 e a 2 terminarem = tanto faz quem terminar primeiro, a 2 ou a 1, que você teria a condição correta.
Uma vantagem de usar a boost é que seu programa fica bem mais fácil de portar para o Windows (ou vice-versa, portar um programa Windows para o Unix/Linux). Onde estou trabalhando há um projeto de portar um serviço do Windows para o Linux, que será possível porque ele foi escrito usando principalmente as bibliotecas do Boost. [/quote]
Na verdade eu inicio ela e soh finalizo no caso de alguma exception, pois meu caso de thread eh pra uso de multiplas conexoes de socket, esse projeto em C++ eh um socker server, entao eu nao preciso esperar terminar entendeu.
O Boost tem um negócio pronto para múltiplas conexões de socket, chamado “boost::asio”. Você pode usá-lo com conexões assíncronas, economizando threads se você quiser ter muitas conexões simultâneas ao mesmo tempo.