void SocketServer::serve() { while (!m_done) { // create slave socket SOCKET slaveSocket = accept(...); // spin until some requests get processed while (enqueue(slaveSocket)) boost::thread::yield(); } } void SocketServer::processQueue() { for (;;) { Request request = dequeue(); int socket = request.socket; if (!valid_socket(socket)) break; serve(socket); } } int SocketServer::enqueue(SocketServer::Request request) { boost::mutex::scoped_lock lock(m_queueMutex); if (m_queue.size() >= m_queueSize) return -1; m_queue.push(request); m_queueCond.notify_one(); return 1; } SocketServer::Request SocketServer::dequeue() { boost::mutex::scoped_lock lock(m_queueMutex); while (m_queue.empty()) m_queueCond.wait(lock); SocketServer::Request request = m_queue.front(); m_queue.pop(); return request; }