Carbonite Tasking# Contents: Tasking Overview Overview Quick Start Architecture API API Documentation Best Practices Think in Terms of Coroutines No Thread-Specific Data Sleeping Suspend/Wake Determine if Running as a Task Pinning to a Specific Thread Mutexes Switch to a fiber-aware mutex Reduce mutex lock scope Do not hold locks over callbacks Pinning as a last resort Fibers vs. Threads Overview Job Systems Co-routines “Stackful” vs. “Stackless” Using Threads as Parallelized Co-Routines? Using Fibers as Parallelized Co-Routines History Timings Benchmarks on an AMD Threadripper PRO 5975W 3.6 GHz running Windows 11 21H2 Benchmarks on an Intel i9-7900X @ 3.30GHz running Ubuntu 22.04.02 LTS Frequently Asked Questions Conclusion Anatomy of a Task Priority Trackers No Trackers TaskGroup Tracker TaskContext Tracker Future<void> Tracker Counter Tracker Invocable Objects Lambda Function and Pointer-to-Function Member Functions Functors Execution Notifying threads of work Assigning a fiber Invoking the Callable Notifying Trackers Returning Values Task Completion and Guarantees Phase 1: Tracker Exit Phase 2: Task Completion Cancellation Other Task Types Throttled Tasks Sub-tasks Timed Tasks ISettings keys Parallel Algorithms Parallel-For / applyRange Batch size heuristic Recursive applyRange Parallel-Sort Parallel-Reduce Synchronization Synchronous Tasks TaskGroup Waiting Throttling The “Main” Priority Counters (Deprecated) Deprecation Warning Signaling task completion Manual Counter Manipulation Sub-tasks Notifications How it works Implementing IFiberEvents Debugging Linux Debugging Windows Debugging ApplyRange Calls Task Counts Showing All Tasks Task Prerequisites debugTaskBacktrace Unsafe Mutex Locks debugLocks (Windows only) debugAlwaysContextSwitch suppressTaskException Last resort: Pinning Debugging Deadlocks Emergency Threads Running out of Fibers Waiting in a non-Fiber-Safe Manner debugWaitingTasks