-
Notifications
You must be signed in to change notification settings - Fork 0
/
workerlockless.cpp
68 lines (50 loc) · 1.21 KB
/
workerlockless.cpp
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include "workerlockless.h"
workerLockless::workerLockless() : _task(nullptr), _stop(false)
{
}
workerLockless::workerLockless(string Name) : _task(nullptr), _stop(false), _name(Name)
{
}
workerLockless::workerLockless(const workerLockless &Other): workerLockless(Other._name)
{
}
workerLockless &workerLockless::operator =(workerLockless &&Other)
{
if (this == &Other)
return *this;
_name = std::move(Other._name);
}
void workerLockless::run()
{
for(;!_stop;){
if (_task == nullptr)
break;
auto localTask = std::move(_task);
_task = nullptr;
if (_stop)
return;
localTask();
}
}
void workerLockless::start(shared_ptr<workerLockless>&& worker)
{
shared_ptr<workerLockless> w =std::move(worker);
//Encapsulet in a closure so the worker is not deleted until thread end
function<void ()> guard = [w](){w->run();};
//Run the thread
_thr = std::thread(guard);
//Dont wait for finalization
_thr.detach();
}
void workerLockless::stop()
{
_stop = true;
}
void workerLockless::Process(function<void ()>&& Task)
{
_task = std::move(Task);
}
void workerLockless::WaitUntilFinish()
{
_thr.join();
}