FazBrowse GitHub Viewer
|
Trending
|
URL:
|
Home
Tools:
[Download Repo ZIP]
[View Raw Code]
[Original HTTPS Page]
ThreadPool/ThreadPool.h at master · laparca/ThreadPool · GitHub
laparca
/
ThreadPool
Public
forked from
progschj/ThreadPool
Notifications
You must be signed in to change notification settings
Fork
0
Star
0
Code
Pull requests
0
Actions
Projects
Security and quality
0
Insights
Additional navigation options
Code
Pull requests
Actions
Projects
Security and quality
Insights
Expand file tree
Breadcrumbs
ThreadPool
/
ThreadPool.h
Copy path
More file actions
More file actions
Latest commit
History
History
History
93 lines (83 loc) · 2.46 KB
Breadcrumbs
ThreadPool
/
ThreadPool.h
Copy path
File metadata and controls
93 lines (83 loc) · 2.46 KB
Raw
Copy raw file
Download raw file
Open symbols panel
Edit and raw actions
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#
ifndef
THREAD_POOL_H
#
define
THREAD_POOL_H
#
include
<
vector
>
#
include
<
queue
>
#
include
<
memory
>
#
include
<
thread
>
#
include
<
mutex
>
#
include
<
condition_variable
>
#
include
<
future
>
#
include
<
functional
>
#
include
<
stdexcept
>
class
ThreadPool
{
public:
ThreadPool
(
size_t
);
template
<
class
F
,
class
... Args>
auto
enqueue
(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>;
~ThreadPool
();
private:
//
need to keep track of threads so we can join them
std::vector< std::thread > workers;
//
the task queue
std::queue< std::function<
void
()> > tasks;
//
synchronization
std::mutex queue_mutex;
std::condition_variable condition;
bool
stop;
};
//
the constructor just launches some amount of workers
inline
ThreadPool::ThreadPool
(
size_t
threads)
: stop(
false
)
{
for
(
size_t
i =
0
;i<threads;++i)
workers.
emplace_back
(
[
this
]
{
while
(
true
)
{
std::unique_lock<std::mutex>
lock
(
this
->
queue_mutex
);
while
(!
this
->
stop
&&
this
->
tasks
.
empty
())
this
->
condition
.
wait
(lock);
if
(
this
->
stop
&&
this
->
tasks
.
empty
())
return
;
std::function<
void
()>
task
(
this
->
tasks
.
front
());
this
->
tasks
.
pop
();
lock.
unlock
();
task
();
}
}
);
}
//
add new work item to the pool
template
<
class
F
,
class
... Args>
auto
ThreadPool::enqueue
(F&& f, Args&&... args)
-> std::future<typename std::result_of<F(Args...)>::type>
{
typedef
typename
std::result_of<
F
(Args...)>::type return_type;
//
don't allow enqueueing after stopping the pool
if
(stop)
throw
std::runtime_error
(
"
enqueue on stopped ThreadPool
"
);
auto
task = std::make_shared< std::packaged_task<
return_type
()> >(
std::bind
(std::forward<F>(f), std::forward<Args>(args)...)
);
std::future<return_type> res = task->
get_future
();
{
std::unique_lock<std::mutex>
lock
(queue_mutex);
tasks.
push
([task](){ (*task)(); });
}
condition.
notify_one
();
return
res;
}
//
the destructor joins all threads
inline
ThreadPool::~ThreadPool
()
{
{
std::unique_lock<std::mutex>
lock
(queue_mutex);
stop =
true
;
}
condition.
notify_all
();
for
(
size_t
i =
0
;i<workers.
size
();++i)
workers[i].
join
();
}
#
endif
Back
|
FazBrowse Home
|
New Git URL