Tengo una función wait_pop(), que hace pop en la cola si esta no está vacía. Si la cola está vacía entonces se espera a que llegue un elemento.
Estas son las funciones correspondientes:
Código C++:
Ver original
class queue{ //... std::condition_variable Variable; mutable std::mutex Cerrojo; void waitSomething(std::unique_lock<std::mutex> &e,std::condition_variable &Condicion, bool (queue<T>::*predicado)() const) { while (((*this).*predicado)()) { Condicion.wait(e); } } void consumer_enterprotocol(std::unique_lock<std::mutex> &e) { waitSomething(e,Variable_Push,&queue<T>::empty_nothreadsafe); } void producer_exitprotocol(std::unique_lock<std::mutex> &e) { e.unlock(); Variable.notify_one(); } bool empty_nothreadsafe() const noexcept override { return Cola.empty(); } //PUBLIC... void push(const T &elemento) { unique_lock<std::mutex> e(Cerrojo); producer_enterprotocol(e); Cola.push(elemento); producer_exitprotocol(e); } void wait_pop(T &elemento) { unique_lock<std::mutex> e(Cerrojo); consumer_enterprotocol(e); pop_nothreadsafe(elemento); consumer_exitprotocol(e); }
Y el código de pruebas:
Código C++:
Ver original
#include <iostream> #include "STL Threadsafe/queue thread safe.hpp" std::threadsafe::queue<int> Cola; int max = 200; void hilo() { for (int i = 0;i<max;i++) { Cola.push(i); } } int main() { int e = 0; std::thread t(hilo); // std::this_thread::sleep_for(std::chrono::milliseconds(1)); for (int i = 0;i<max;i++) { Cola.wait_pop(e); std::cout<<e<<std::endl; } std::cout<<"Fin: "<<Cola.size()<<std::endl; t.join(); }
Sin embargo, este código se me queda bloqueado en el wait_pop indefinidamente. Si quito la línea comentada (el sleep) entonces si funciona perfecto. Lo he estado revisando pero caigo en la idea.
Subo el código completo por si alguien quiere compilarlo. El código completo es más complicado que este (lo he simplificado un poquito en el post), los métodos están en lineal_container en vez de queue:
https://dl.dropboxusercontent.com/u/...%20amchacon.7z