1#include <mbgl/util/default_thread_pool.hpp>
2#include <mbgl/actor/mailbox.hpp>
3#include <mbgl/util/platform.hpp>
4#include <mbgl/util/string.hpp>
5
6namespace mbgl {
7
8ThreadPool::ThreadPool(std::size_t count) {
9 threads.reserve(n: count);
10 for (std::size_t i = 0; i < count; ++i) {
11 threads.emplace_back(args: [this, i]() {
12 platform::setCurrentThreadName(std::string{ "Worker " } + util::toString(t: i + 1));
13
14 while (true) {
15 std::unique_lock<std::mutex> lock(mutex);
16
17 cv.wait(lock&: lock, p: [this] {
18 return !queue.empty() || terminate;
19 });
20
21 if (terminate) {
22 return;
23 }
24
25 auto mailbox = queue.front();
26 queue.pop();
27 lock.unlock();
28
29 Mailbox::maybeReceive(mailbox);
30 }
31 });
32 }
33}
34
35ThreadPool::~ThreadPool() {
36 {
37 std::lock_guard<std::mutex> lock(mutex);
38 terminate = true;
39 }
40
41 cv.notify_all();
42
43 for (auto& thread : threads) {
44 thread.join();
45 }
46}
47
48void ThreadPool::schedule(std::weak_ptr<Mailbox> mailbox) {
49 {
50 std::lock_guard<std::mutex> lock(mutex);
51 queue.push(x: mailbox);
52 }
53
54 cv.notify_one();
55}
56
57} // namespace mbgl
58

source code of qtlocation/src/3rdparty/mapbox-gl-native/platform/default/mbgl/util/default_thread_pool.cpp