File: clConcurrent.cpp

package info (click to toggle)
codelite 17.0.0%2Bdfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 136,244 kB
  • sloc: cpp: 491,547; ansic: 280,393; php: 10,259; sh: 8,930; lisp: 7,664; vhdl: 6,518; python: 6,020; lex: 4,920; yacc: 3,123; perl: 2,385; javascript: 1,715; cs: 1,193; xml: 1,110; makefile: 804; cobol: 741; sql: 709; ruby: 620; f90: 566; ada: 534; asm: 464; fortran: 350; objc: 289; tcl: 258; java: 157; erlang: 61; pascal: 51; ml: 49; awk: 44; haskell: 36
file content (47 lines) | stat: -rw-r--r-- 1,135 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include "clConcurrent.hpp"

#include "file_logger.h"

#include <sstream>

clConcurrent::clConcurrent(size_t pool_size)
    : m_pool_size(pool_size)
{
    m_shutdown.store(false);
}

clConcurrent::~clConcurrent() { shutdown(); }

void clConcurrent::run()
{
    shutdown();
    m_thread_pool.reserve(m_pool_size);

    for(size_t i = 0; i < m_pool_size; ++i) {
        std::thread* thr = new std::thread([&]() {
            std::stringstream ss;
            ss << std::this_thread::get_id();
            clDEBUG() << "worker thread #" << ss.str() << endl;
            Callback command;
            while(!m_shutdown.load()) {
                Callback cb;
                if(m_queue.ReceiveTimeout(100, cb) == wxMSGQUEUE_NO_ERROR) {
                    cb();
                }
            }
            clDEBUG() << "worker thread #" << ss.str() << "is going down" << endl;
        });
        m_thread_pool.push_back(thr);
    }
}

void clConcurrent::shutdown()
{
    m_shutdown.store(true);
    for(auto thr : m_thread_pool) {
        thr->join();
        wxDELETE(thr);
    }
    m_thread_pool.clear();
    m_shutdown.store(false);
}