Skip to content

A fastest, exception-safety and pure C++17 thread pool.

License

Notifications You must be signed in to change notification settings

Fdhvdu/ThreadPool

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Warnings

Since commit 468129863ec65c0b4ede02e8581bea682351a6d2, I move ThreadPool to C++17. (To use std::apply.)
In addition, the rule of passing parameters to ThreadPool is different.
Unlike before, which uses std::bind, ThreadPool will not copy anything right now.
All of ThreadPool does is forward (no decay).
This means you have to copy arguments by yourself before passing it to ThreadPool.
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
Class view
Performance comparison
Compiler
How to compile
Compilation errors?
Tutorial
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++).
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.
Use the CThreadPool when you don't care the return value of function.
CThreadPool::add_and_detach is faster (very) than CThreadPool_Ret::add.

Performance comparison

progschj/ThreadPool, see Comparison.
Tyler-Hardin/thread_pool, see Comparison.
P.S. About bilash/threadpool, I don't want to test a C-like code.
P.S. nbsdx/ThreadPool cannot pass testing, see README.
P.S. philipphenkel/threadpool cannot pass testing, see README.
P.S. tghosgor/threadpool11 cannot pass testing, see README.
P.S. mtrebi/thread-pool cannot pass testing, see README.
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.
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
To use example.cpp:

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

To use example_ret.cpp:

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
work stealing

About

A fastest, exception-safety and pure C++17 thread pool.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published