C++ (Qt) void worker() { while (!m_is_stop) { { std::unique_lock<std::mutex> lock(m_mutex); m_loop_cv.wait(lock, [&]() { return !m_queue.empty() || m_is_stop; }); } if (m_is_stop) return; std::function<void()> work_function([](){}); { // std::lock_guard<std::mutex> lock(m_mutex); <<< и так золочен // if (!m_queue.empty()) <<< тут точно не пусто - проверено в wait { work_function = std::move(m_queue.front()); m_queue.pop(); } } // Разлочиваем и запускаем работу lock.unlock(); work_function(); } }
C++ (Qt)while (!m_is_stop) { { std::unique_lock<std::mutex> lock(m_mutex); m_loop_cv.wait(lock, [&]() { return !m_queue.empty() || m_is_stop; }); } // <<< Здесь lock уже откинулся и освободил m_mutex if (m_is_stop) return; std::function<void()> work_function([](){}); { // std::lock_guard<std::mutex> lock(m_mutex); <<< и так золочен // if (!m_queue.empty()) <<< тут точно не пусто - проверено в wait { work_function = std::move(m_queue.front()); m_queue.pop(); } } // Разлочиваем и запускаем работу lock.unlock(); work_function(); } }
C++ (Qt)void worker() { while (!m_is_stop) { std::unique_lock<std::mutex> lock(m_mutex); m_loop_cv.wait(lock, [&]() { return !m_queue.empty() || m_is_stop; }); if (m_is_stop) return; std::function<void()> work_function(m_queue.front()); m_queue.pop(); lock.unlock(); work_function(); } }
C++ (Qt)wait( mutex m ){ m.unlock() yield() m.lock()}
C++ (Qt)auto task_ptr = std::make_shared<std::packaged_task<decltype(work_function())()>>(std::forward<F>(work_function));
C++ (Qt)class thread_pool{...private:... std::list<std::shared_ptr<std::thread>> m_threads;...};
C++ (Qt)vector<thread> m_threads;