1*042d53a7SEvalZero /* 2*042d53a7SEvalZero wqueue.h 3*042d53a7SEvalZero Worker thread queue based on the Standard C++ library list 4*042d53a7SEvalZero template class. 5*042d53a7SEvalZero ------------------------------------------ 6*042d53a7SEvalZero Copyright (c) 2013 Vic Hargrave 7*042d53a7SEvalZero Licensed under the Apache License, Version 2.0 (the "License"); 8*042d53a7SEvalZero you may not use this file except in compliance with the License. 9*042d53a7SEvalZero You may obtain a copy of the License at 10*042d53a7SEvalZero http://www.apache.org/licenses/LICENSE-2.0 11*042d53a7SEvalZero Unless required by applicable law or agreed to in writing, software 12*042d53a7SEvalZero distributed under the License is distributed on an "AS IS" BASIS, 13*042d53a7SEvalZero WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*042d53a7SEvalZero See the License for the specific language governing permissions and 15*042d53a7SEvalZero limitations under the License. 16*042d53a7SEvalZero */ 17*042d53a7SEvalZero 18*042d53a7SEvalZero // https://vichargrave.github.io/articles/2013-01/multithreaded-work-queue-in-cpp 19*042d53a7SEvalZero // https://github.com/vichargrave/wqueue/blob/master/wqueue.h 20*042d53a7SEvalZero 21*042d53a7SEvalZero 22*042d53a7SEvalZero #ifndef __wqueue_h__ 23*042d53a7SEvalZero #define __wqueue_h__ 24*042d53a7SEvalZero 25*042d53a7SEvalZero #include <pthread.h> 26*042d53a7SEvalZero #include <list> 27*042d53a7SEvalZero 28*042d53a7SEvalZero using namespace std; 29*042d53a7SEvalZero 30*042d53a7SEvalZero template <typename T> class wqueue 31*042d53a7SEvalZero { 32*042d53a7SEvalZero list<T> m_queue; 33*042d53a7SEvalZero pthread_mutex_t m_mutex; 34*042d53a7SEvalZero pthread_cond_t m_condv; 35*042d53a7SEvalZero 36*042d53a7SEvalZero public: wqueue()37*042d53a7SEvalZero wqueue() 38*042d53a7SEvalZero { 39*042d53a7SEvalZero pthread_mutexattr_t attr; 40*042d53a7SEvalZero pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE); 41*042d53a7SEvalZero pthread_mutex_init(&m_mutex, &attr); 42*042d53a7SEvalZero pthread_cond_init(&m_condv, NULL); 43*042d53a7SEvalZero } 44*042d53a7SEvalZero ~wqueue()45*042d53a7SEvalZero ~wqueue() { 46*042d53a7SEvalZero pthread_mutex_destroy(&m_mutex); 47*042d53a7SEvalZero pthread_cond_destroy(&m_condv); 48*042d53a7SEvalZero } 49*042d53a7SEvalZero put(T item)50*042d53a7SEvalZero void put(T item) { 51*042d53a7SEvalZero pthread_mutex_lock(&m_mutex); 52*042d53a7SEvalZero m_queue.push_back(item); 53*042d53a7SEvalZero pthread_cond_signal(&m_condv); 54*042d53a7SEvalZero pthread_mutex_unlock(&m_mutex); 55*042d53a7SEvalZero } 56*042d53a7SEvalZero get(uint32_t tmo)57*042d53a7SEvalZero T get(uint32_t tmo) { 58*042d53a7SEvalZero pthread_mutex_lock(&m_mutex); 59*042d53a7SEvalZero if (tmo) { 60*042d53a7SEvalZero while (m_queue.size() == 0) { 61*042d53a7SEvalZero pthread_cond_wait(&m_condv, &m_mutex); 62*042d53a7SEvalZero } 63*042d53a7SEvalZero } 64*042d53a7SEvalZero 65*042d53a7SEvalZero T item = NULL; 66*042d53a7SEvalZero 67*042d53a7SEvalZero if (m_queue.size() != 0) { 68*042d53a7SEvalZero item = m_queue.front(); 69*042d53a7SEvalZero m_queue.pop_front(); 70*042d53a7SEvalZero } 71*042d53a7SEvalZero 72*042d53a7SEvalZero pthread_mutex_unlock(&m_mutex); 73*042d53a7SEvalZero return item; 74*042d53a7SEvalZero } 75*042d53a7SEvalZero size()76*042d53a7SEvalZero int size() { 77*042d53a7SEvalZero pthread_mutex_lock(&m_mutex); 78*042d53a7SEvalZero int size = m_queue.size(); 79*042d53a7SEvalZero pthread_mutex_unlock(&m_mutex); 80*042d53a7SEvalZero return size; 81*042d53a7SEvalZero } 82*042d53a7SEvalZero }; 83*042d53a7SEvalZero 84*042d53a7SEvalZero #endif 85