- We needed to add asynchrony to our code.
- The code here is a set of helpers that utilize the underlying deque, semaphore, mutex features found in std.
- Be instructive while providing functional code
- Use only C++20 standard code: jthread, deque, semaphore, barriers and latch
Requires C++20 support!
Specifically we require
jthreadandstop_tokensupport which is unfortunately not available in the Apple Clang 16 version. This library works with gcc 14+ or MSVC 17+ or Clang 18+.
Refer to the documentation for details.
The library uses concepts to ensure the type T meets move construct requirements.
#include "siddiqsoft/simple_worker.hpp" // Define your data struct MyWork { std::string urlDestination{}; std::string data{}; void operator()(){ magic_post_to(urlDestination, data); } }; void main() { // Declare worker with our data type and the driver function. siddiqsoft::simple_worker<MyWork> worker{[](auto& item){ // call the item's operator() // to invoke actual work. item(); }}; // Fire 100 items for( int i=0; i < 100; i++ ) { // Queues into the single worker worker.queue({std::format("https://localhost:443/test?iter={}",i), "hello-world"}); } // As the user, you must control the lifetime of the worker // Trying to delete the worker will cause it to stop // and abandon any items in the internal deque. std::this_thread::sleep_for(1s); } #include "siddiqsoft/simple_pool.hpp" void main() { // Declare worker with our data type and the driver function. siddiqsoft::simple_pool<MyWork> worker{[](auto& item){ // call the item's operator() // to invoke actual work. item(); }}; // Fire 100 items for( int i=0; i < 100; i++ ) { // Queues into the single queue but multiple worker threads // (defaults to CPU thread cout) worker.queue({std::format("https://localhost:443/test?iter={}",i), "hello-world"}); } // As the user, you must control the lifetime of the worker // Trying to delete the worker will cause it to stop // and abandon any items in the internal deque. std::this_thread::sleep_for(1s); }#include "siddiqsoft/roundrobin_pool.hpp" void main() { // Declare worker with our data type and the driver function. siddiqsoft::roundrobin_pool<MyWork> worker{[](auto& item){ // call the item's operator() // to invoke actual work. item(); }}; // Fire 100 items for( int i=0; i < 100; i++ ) { // Queues into the thread pools individual queue by round-robin // across the threads with simple counter. // (defaults to CPU thread cout) worker.queue({std::format("https://localhost:443/test?iter={}",i), "hello-world"}); } // As the user, you must control the lifetime of the worker // Trying to delete the worker will cause it to stop // and abandon any items in the internal deque. std::this_thread::sleep_for(1s); }Provides a basic resource pool useful for keeping a pool of connection objects for the various threadpools to checkout/checkin.
namespace siddiqsoft { template<typename T> class resource_pool { public: auto getCapacity(); [[nodiscard]] T checkout(); /* throw() */ void checkin(T&& rsrc); }; }In order to use std::jthread on Clang 18 and Clang 19, we enable the compiler flag "CMAKE_CXX_FLAGS": "-fexperimental-library" in the CMakeLists.txt. This option will show up in your client library under Clang compilers.
© 2021 Siddiq Software LLC. All rights reserved.