Home

Awesome

Warnings

Since commit 468129863ec65c0b4ede02e8581bea682351a6d2, I move ThreadPool to C++17. (To use std::apply.)<br> In addition, the rule of passing parameters to ThreadPool is different.<br> Unlike before, which uses std::bind, ThreadPool will not copy anything right now.<br> All of ThreadPool does is forward (no decay).<br> This means you have to copy arguments by yourself before passing it to ThreadPool.<br> Below is demonstration,

void test(int &i)
{
	i=10;
}

int main()
{
	int i(0);
	CThreadPool tp;
	tp.join(tp.add(test,i));

	//before commit f66048ed999aa1b50dc956c4a728ff565042d761
	cout<<i<<endl;	//0

	//since commit f66048ed999aa1b50dc956c4a728ff565042d761
	cout<<i<<endl;	//10
}

Contents

Introduction<br> Class view<br> Performance comparison<br> Compiler<br> How to compile<br> Compilation errors?<br> Tutorial<br> Future work

Introduction

This is a pure (which means it doesn't depend on any platform) and exception-safety C++ threadpool (so far, there is no standard threadpool in C++).<br> The goal of this project is to provide a fastest, beautiful and easy-to-use C++ threadpool library.

Class view

Two classes

CThreadPool, including the member function
	thread_id    add(Func &&,Args &&...)
	void         add_and_detach(Func &&,Args &&...)
	size_type    empty() const noexcept
	void         join(thread_id)
	void         join_all()
	bool         joinable(thread_id) const
	size_type    size() const noexcept
	void         wait_until_all_usable() const
	
CThreadPool_Ret, including the member function
	thread_id    add(Func &&,Args &&...)
	size_type    empty() const noexcept
	Ret          get(thread_id)
	size_type    size() const noexcept
	bool         valid(thread_id) const
	void         wait(thread_id) const
	void         wait_all() const

Use the CThreadPool_Ret when you want to get the return value of function.<br> Use the CThreadPool when you don't care the return value of function.<br> CThreadPool::add_and_detach is faster (very) than CThreadPool_Ret::add.

Performance comparison

progschj/ThreadPool, see Comparison.<br> Tyler-Hardin/thread_pool, see Comparison.<br> P.S. About bilash/threadpool, I don't want to test a C-like code.<br> P.S. nbsdx/ThreadPool cannot pass testing, see README.<br> P.S. philipphenkel/threadpool cannot pass testing, see README.<br> P.S. tghosgor/threadpool11 cannot pass testing, see README.<br> P.S. mtrebi/thread-pool cannot pass testing, see README.<br> See the directory for more details.

Compiler

Visual Studio 2017 15.5.5
g++ 7.2.1
clang++ 5.0.1

How to compile

You have to download my lib first.<br> The directory should be look like

├── lib
│   ├── header
│   ├── LICENSE
│   ├── README.md
│   ├── src
│   └── tutorial
└── ThreadPool
    ├── comparison
    ├── header
    ├── LICENSE
    ├── README.md
    ├── src
    └── tutorial

Don't forget to compile lib/src/Scope_guard.cpp.

Compilation errors?

See How to compile or email me

Tutorial

I provide example.cpp and example_ret.cpp to help you understand how to use this powerful thread pool<br> To use example.cpp:<br>

g++ -std=c++17 tutorial/example.cpp src/* ../lib/src/Scope_guard.cpp

To use example_ret.cpp:<br>

g++ -std=c++17 tutorial/example_ret.cpp src/IThreadPoolItemBase.cpp ../lib/src/Scope_guard.cpp

Future work

add a non-block version of CThreadPool::add<br> work stealing