SiddiqSoft.asynchrony 1.7.3

There is a newer version of this package available.
See the version list below for details.
dotnet add package SiddiqSoft.asynchrony --version 1.7.3                
NuGet\Install-Package SiddiqSoft.asynchrony -Version 1.7.3                
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="SiddiqSoft.asynchrony" Version="1.7.3" />                
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add SiddiqSoft.asynchrony --version 1.7.3                
#r "nuget: SiddiqSoft.asynchrony, 1.7.3"                
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install SiddiqSoft.asynchrony as a Cake Addin
#addin nuget:?package=SiddiqSoft.asynchrony&version=1.7.3

// Install SiddiqSoft.asynchrony as a Cake Tool
#tool nuget:?package=SiddiqSoft.asynchrony&version=1.7.3                

asynchrony : Add asynchrony to your apps

Build Status alternate text is missing from this package README image alternate text is missing from this package README image alternate text is missing from this package README image

Motivation

  • 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
  • No external dependency

Usage

Requires C++20 support!

Specifically we require jthread and stop_token support 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.

Single threaded worker

#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);
}

Multi-threaded worker pool

#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);
}

Multi-threaded roundrobin pool

#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);
}

Implementation note

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.

<p align="right"> © 2021 Siddiq Software LLC. All rights reserved. </p>

Product Compatible and additional computed target framework versions.
native native is compatible. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

This package has no dependencies.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on SiddiqSoft.asynchrony:

Package Downloads
SiddiqSoft.restcl

Focussed REST Client for modern C++

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.8.0 131 12/16/2024
1.7.3 184 12/7/2024
1.7.2 81 12/7/2024
1.7.1 77 12/7/2024
1.6.1 258 10/28/2024