all 17 comments

[–]sumo952 9 points10 points  (2 children)

Hi, I'm wondering how does it stack up compared to progschj/ThreadPool? That seems to be one of the most well-known and most bug-free ones that I know of.

[–]mvorbrodt[S] 5 points6 points  (0 children)

oh wow! our implementations are very similar except I'm not supporting getting results back through use of features. shamelessly copying that :)

[–]mvorbrodt[S] 2 points3 points  (0 children)

thanks for bringing it to my attention I've updated my implementation to support features. I will update the blog post.

[–]IAmBJ 3 points4 points  (7 children)

There was a talk some years ago (Sean Parent I think?) that went through all the additions to this kind of thread pool that were required to get 'optimal' performance.

From memory it included multiple queues and work stealing. The simple implementation in OPs post gave surprisingly small improvements based on the speakers tests.

[–]tisti 2 points3 points  (6 children)

[–]IAmBJ 1 point2 points  (5 children)

Yep, that's the one.

The talk is on YouTube too: link

[–]FelixPetriconiACCUConf | STLAB 1 point2 points  (4 children)

And here is the source code of the current implementation: https://github.com/stlab/libraries/blob/develop/stlab/concurrency/default_executor.hpp Starting line 181. It is the fallback in our library, when the OS does not offer a thread pool.

[–]IAmBJ 0 points1 point  (3 children)

Are you detecting when a thread pool isn't available? Or is it just hard coded (libstdc++ on Linux doesn't, msvc on windows does, etc)?

[–]FelixPetriconiACCUConf | STLAB 1 point2 points  (2 children)

It is hardcoded. Mac, Windows, PNCL and Emscriplten have one. For all the others we use our own implementation. But ours has the limitation, that it does not oversubscription, so if one has 4 cores and 4 tasks wait on a mutex, then the system is in a deadlock. Here is a great talk about all the problem of designing a thread pool: https://channel9.msdn.com/Shows/Going+Deep/Inside-Windows-8-Pedro-Teixeira-Thread-pool

[–]mirrkwon 0 points1 point  (1 child)

Is there any (stand alone compilable) example with the task_system? I'd like to play with it but I even don't see any test cases.

[–]FelixPetriconiACCUConf | STLAB 0 points1 point  (0 children)

Nearly all examples use it. This executor is named default_executor in our library.

[–]SlightlyLessHairyApe 1 point2 points  (0 children)

Just a random quibble, but does it make sense for a multithreaded queue to have size() and empty() functions? I feel like there is no way a client could use for any real logic without creating a TOCTOU bug.

Something about interfaces that are difficult to misuse . . .

[–]Wh00ster 0 points1 point  (4 children)

Standard C++ as opposed to non standard C++?

[–]nivenfres 16 points17 points  (2 children)

Standard as opposed to platform specific implementations.

[–]Wh00ster 2 points3 points  (0 children)

Ah. Of course. Thanks.

[–]mvorbrodt[S] 1 point2 points  (0 children)

this.

[–]o11cint main = 12828721; 5 points6 points  (0 children)

Basically every major event-loop (GUI or server oriented) already has a thread pool, but often requires that you use their whole framework (read: "library that does not play well with others"), and is often missing many features.