<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Artak Avetyan</title>
    <description>The latest articles on DEV Community by Artak Avetyan (@aregtech).</description>
    <link>https://dev.to/aregtech</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F741067%2F50eefc3d-5d6f-4ffb-a2af-93f1a5176f8e.png</url>
      <title>DEV Community: Artak Avetyan</title>
      <link>https://dev.to/aregtech</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/aregtech"/>
    <language>en</language>
    <item>
      <title>C++20 Coroutines vs Event-Driven Frameworks: Two Approaches to Async Programming</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Thu, 19 Feb 2026 12:28:45 +0000</pubDate>
      <link>https://dev.to/aregtech/c20-coroutines-vs-event-driven-frameworks-two-approaches-to-async-programming-58ej</link>
      <guid>https://dev.to/aregtech/c20-coroutines-vs-event-driven-frameworks-two-approaches-to-async-programming-58ej</guid>
      <description>&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;: Technical deep-dive comparing C++20 coroutines and Areg SDK. Understand the trade-offs, use cases, and how they complement each other in modern C++ systems.&lt;/p&gt;

&lt;p&gt;C++20 coroutines and &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Areg SDK&lt;/a&gt; represent two distinct approaches to async programming. Coroutines provide sequential syntax for async operations within a process. Areg provides fire-and-forget messaging with built-in IPC, network communication, and thread safety guarantees. They solve different problems and work well together.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Async Programming Challenge
&lt;/h2&gt;

&lt;p&gt;Every C++ developer has written blocking code like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fetchFromNetwork&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Thread blocks&lt;/span&gt;
&lt;span class="n"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;               &lt;span class="c1"&gt;// Waits&lt;/span&gt;
&lt;span class="n"&gt;saveToDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;            &lt;span class="c1"&gt;// Still waiting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The thread sits idle. Resources waste. Throughput suffers.&lt;/p&gt;

&lt;p&gt;Modern C++ offers multiple solutions. This article examines two: &lt;strong&gt;C++20 coroutines&lt;/strong&gt; for sequential async syntax, and &lt;strong&gt;event-driven frameworks&lt;/strong&gt; like Areg SDK for distributed messaging with built-in concurrency management.&lt;/p&gt;




&lt;h2&gt;
  
  
  C++20 Coroutines: Sequential Syntax for Async Operations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Mechanism
&lt;/h3&gt;

&lt;p&gt;A coroutine is a function that can suspend execution and later resume. According to &lt;a href="https://en.cppreference.com/w/cpp/language/coroutines" rel="noopener noreferrer"&gt;cppreference.com&lt;/a&gt;: "Coroutines are stackless: they suspend execution by returning to the caller."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;downloadAndProcess&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;fetchAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Suspends, returns to caller&lt;/span&gt;
    &lt;span class="n"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;                  &lt;span class="c1"&gt;// Resumes here when data arrives&lt;/span&gt;
    &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;saveAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;           &lt;span class="c1"&gt;// Suspends again&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Execution flow&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;co_await&lt;/code&gt; saves coroutine state (local variables, execution point)&lt;/li&gt;
&lt;li&gt;Returns control to caller&lt;/li&gt;
&lt;li&gt;Caller thread continues other work&lt;/li&gt;
&lt;li&gt;When operation completes, someone calls &lt;code&gt;handle.resume()&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Coroutine continues from suspension point&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Sequential Syntax Advantage
&lt;/h3&gt;

&lt;p&gt;Coroutines eliminate callback pyramids and state machines:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;Result&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;processOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;OrderId&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;fetchOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;inventory&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;checkInventory&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;inventory&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;available&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;reserveItems&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;chargePayment&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;payment&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;shipOrder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;co_return&lt;/span&gt; &lt;span class="n"&gt;order&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Local variables persist across suspension points. Control flow reads top-to-bottom.&lt;/p&gt;

&lt;h3&gt;
  
  
  Parallel Execution Pattern
&lt;/h3&gt;

&lt;p&gt;For concurrent operations, start multiple tasks before awaiting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;parallelProcessing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;taskA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;operationA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Starts immediately&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;taskB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;operationB&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Starts immediately&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;taskC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;operationC&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// Starts immediately&lt;/span&gt;

    &lt;span class="c1"&gt;// All three running concurrently&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;resultA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;taskA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Wait for results&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;resultB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;taskB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;resultC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;taskC&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is &lt;strong&gt;structured concurrency&lt;/strong&gt; -- explicit parallelism with clear join points.&lt;/p&gt;

&lt;h3&gt;
  
  
  Infrastructure Requirements
&lt;/h3&gt;

&lt;p&gt;C++20 provides the mechanism, not the infrastructure. You must implement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Custom &lt;code&gt;Task&amp;lt;T&amp;gt;&lt;/code&gt; type with &lt;code&gt;promise_type&lt;/code&gt; and awaiter protocol&lt;/li&gt;
&lt;li&gt;Executor/scheduler to manage coroutine resumption&lt;/li&gt;
&lt;li&gt;Thread affinity system (coroutines have none by default)&lt;/li&gt;
&lt;li&gt;Cancellation and timeout mechanisms&lt;/li&gt;
&lt;li&gt;Custom allocators for embedded/performance-critical code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For distributed systems, add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Serialization layer&lt;/li&gt;
&lt;li&gt;IPC transport&lt;/li&gt;
&lt;li&gt;Network protocols&lt;/li&gt;
&lt;li&gt;Service discovery&lt;/li&gt;
&lt;li&gt;Fault tolerance and reconnection logic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Production-ready coroutine systems require significant infrastructure investment before business logic development begins.&lt;/p&gt;




&lt;h2&gt;
  
  
  Areg SDK: Event-Driven Messaging with Built-In Distribution
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Core Mechanism
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Areg SDK&lt;/a&gt; implements Object RPC (ORPC) where service requests are fire-and-forget operations returning immediately. Responses arrive asynchronously as callbacks, automatically routed across thread, process, or network boundaries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Consumer - fire and forget&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;MyComponent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;initiateRequest&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;mProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestHelloWorld&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Alice"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Returns instantly&lt;/span&gt;
    &lt;span class="c1"&gt;// Continue other work immediately&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Response callback - delivered asynchronously&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;MyComponent&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;responseHelloWorld&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Guaranteed to execute on component's owner thread&lt;/span&gt;
    &lt;span class="n"&gt;LOG_INFO&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Received: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getString&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Three Levels of Asynchrony
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Mechanism&lt;/th&gt;
&lt;th&gt;Thread Blocked?&lt;/th&gt;
&lt;th&gt;Caller Waits?&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Blocking&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Synchronous call&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;&lt;code&gt;recv(socket)&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Async/Await&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Coroutine suspension&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Yes (logically)&lt;/td&gt;
&lt;td&gt;&lt;code&gt;co_await read()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Fire-and-Forget&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Event dispatch&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;&lt;code&gt;proxy.request()&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Areg operates at the highest asynchrony level -- requests never block or suspend the caller.&lt;/p&gt;

&lt;h3&gt;
  
  
  Built-In Infrastructure
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Thread Affinity&lt;/strong&gt;: Component callbacks always execute on the component's designated owner thread. No mutexes, no locks, no data races. Write single-threaded logic that runs safely in multi-threaded systems.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic Service Discovery&lt;/strong&gt;: When a provider starts, it broadcasts availability. Consumers are notified automatically. When a service crashes, consumers receive disconnect notifications and enter waiting state. Reconnection is automatic when the service returns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transport Transparency&lt;/strong&gt;: Critical architectural feature. Same code runs identically for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inter-thread communication (same process)&lt;/li&gt;
&lt;li&gt;Inter-process communication (IPC via shared memory/sockets)&lt;/li&gt;
&lt;li&gt;Network communication (TCP/IP across machines)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No conditional compilation. No transport-specific code. Define the service interface once in &lt;code&gt;.siml&lt;/code&gt; files; generated code handles serialization and routing automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configurable Flow Control&lt;/strong&gt;: Set event queue limits per component. When queues fill:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oldest events of same priority are displaced&lt;/li&gt;
&lt;li&gt;Priority system prevents low-priority events from displacing high-priority events&lt;/li&gt;
&lt;li&gt;Prevents memory exhaustion from producer/consumer rate mismatches&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Broadcast/Pub-Sub&lt;/strong&gt;: One response or event delivers to multiple subscribers simultaneously:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Provider broadcasts&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;TemperatureService&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;requestGetTemperature&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;readSensor&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;responseGetTemperature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// All subscribers notified&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Multiple consumers receive&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Dashboard&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;responseGetTemperature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;updateDisplay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Logger&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;responseGetTemperature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;logValue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;Alarm&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;responseGetTemperature&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;float&lt;/span&gt; &lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;checkThreshold&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;temp&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Combining Both: Complementary Strengths
&lt;/h2&gt;

&lt;p&gt;Coroutines and event-driven frameworks address different concerns:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Coroutines&lt;/strong&gt;: Local async control flow within a process&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Event frameworks&lt;/strong&gt;: Distributed messaging across processes/machines&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;They work together effectively:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Areg service method using coroutines for internal async logic&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;MyService&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;requestComplexOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Local async processing with coroutines&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;intermediate&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;parseAndValidate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;computed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;performCalculation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intermediate&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;verified&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;verifyResult&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="c1"&gt;// Areg broadcasts result across network&lt;/span&gt;
    &lt;span class="n"&gt;responseComplexOperation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;verified&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Automatic IPC/network routing&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Division of responsibility&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Coroutines: Sequential async logic, complex control flow, algorithmic processing&lt;/li&gt;
&lt;li&gt;Areg: Threading management, IPC, network communication, service lifecycle&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Use Case Analysis
&lt;/h2&gt;

&lt;h3&gt;
  
  
  When Coroutines Excel
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Sequential operations with dependencies&lt;/strong&gt;:&lt;br&gt;
Each step requires the previous result. Coroutines maintain readable, maintainable code without manual state machines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I/O-bound single-process servers&lt;/strong&gt;:&lt;br&gt;
Thousands of concurrent connections with minimal per-connection computation. Coroutines enable one thread to multiplex many operations.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Algorithmic async pipelines&lt;/strong&gt;:&lt;br&gt;
Complex async workflows within a single process where linear control flow clarifies logic.&lt;/p&gt;
&lt;h3&gt;
  
  
  When Areg Excels
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Distributed service-oriented systems&lt;/strong&gt;:&lt;br&gt;
Multiple processes or machines providing and consuming services. Areg handles discovery, routing, serialization automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pub-sub architectures&lt;/strong&gt;:&lt;br&gt;
One-to-many communication patterns where events broadcast to multiple subscribers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-threaded applications requiring thread safety&lt;/strong&gt;:&lt;br&gt;
Thread affinity guarantees eliminate data races architecturally, not through defensive locking.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Systems requiring transport flexibility&lt;/strong&gt;:&lt;br&gt;
Develop locally (inter-thread), test with IPC, deploy distributed -- same codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fog/edge computing and IoT&lt;/strong&gt;:&lt;br&gt;
Devices dynamically discovering services, handling network failures, reconnecting automatically.&lt;/p&gt;


&lt;h2&gt;
  
  
  Trade-Off Analysis: What Each Cannot Do
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Coroutines Limitations for Distribution
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;No broadcast&lt;/strong&gt;: One &lt;code&gt;co_await&lt;/code&gt; resumes one coroutine. Delivering results to multiple consumers requires additional infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No thread affinity&lt;/strong&gt;: Without custom executors, coroutines may resume on arbitrary threads, making thread-local storage unsafe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No built-in IPC&lt;/strong&gt;: Serialization, transport, routing, service discovery -- all manual implementation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;State machine distribution&lt;/strong&gt;: Coroutine state lives in one process. Distributing stateful workflows across processes requires external coordination.&lt;/p&gt;
&lt;h3&gt;
  
  
  Event-Driven Limitations for Sequential Logic
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;State storage across callbacks&lt;/strong&gt;: Multi-step operations require member variables to hold intermediate state:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SequentialProcessor&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="n"&gt;mStepA&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// Store between callbacks&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mStepB&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;startProcessing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestStepA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;responseStepA&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mStepA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;mProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestStepB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mStepA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;responseStepB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mStepB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="n"&gt;mProxy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestStepC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mStepA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mStepB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compare with coroutine's linear flow:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sequentialProcessing&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;stepA&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;requestStepA&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;stepB&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;requestStepB&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stepA&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;stepC&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;co_await&lt;/span&gt; &lt;span class="n"&gt;requestStepC&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stepA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stepB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For complex local sequential logic, coroutines reduce code verbosity and improve maintainability.&lt;/p&gt;




&lt;h2&gt;
  
  
  Performance Considerations
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Different Optimization Goals
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Coroutines optimize for&lt;/strong&gt;:&lt;br&gt;
Local execution efficiency. Minimal per-operation overhead within a single process. Primary cost is initial frame allocation -- mitigated with custom allocators.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Areg optimizes for&lt;/strong&gt;:&lt;br&gt;
Distributed system productivity. Event dispatch includes serialization, thread-safe queuing, and cross-process routing overhead. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Critical insight&lt;/strong&gt;: When services communicate over IPC or network, Areg's dispatch overhead is negligible compared to transport latency. Network calls measure in milliseconds; event dispatch in microseconds -- 0.1% of total time.&lt;/p&gt;

&lt;p&gt;Areg competes with &lt;strong&gt;manually implementing distributed systems infrastructure&lt;/strong&gt; (weeks of development, error-prone), not with local-only coroutines that provide no distribution support.&lt;/p&gt;
&lt;h3&gt;
  
  
  Resource Characteristics
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;Coroutines&lt;/th&gt;
&lt;th&gt;Areg Events&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Allocation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Heap-allocated frame&lt;/td&gt;
&lt;td&gt;Heap-allocated event object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Thread model&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;No built-in affinity&lt;/td&gt;
&lt;td&gt;Strict thread affinity per component&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Thousands of concurrent operations&lt;/td&gt;
&lt;td&gt;Thousands of concurrent services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Distribution&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Requires custom implementation&lt;/td&gt;
&lt;td&gt;Built-in IPC/network support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Both are lightweight enough for production systems. Choose based on architectural requirements, not raw performance numbers.&lt;/p&gt;


&lt;h2&gt;
  
  
  Decision Framework
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Choose C++20 Coroutines When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Building single-process async systems&lt;/li&gt;
&lt;li&gt;Sequential operations with dependencies are common&lt;/li&gt;
&lt;li&gt;Linear code readability improves maintainability for your team&lt;/li&gt;
&lt;li&gt;I/O-bound workloads with many concurrent operations&lt;/li&gt;
&lt;li&gt;You have expertise to build coroutine infrastructure (or use existing libraries)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Choose Areg SDK When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Building distributed systems (multi-process or multi-machine)&lt;/li&gt;
&lt;li&gt;IPC or network communication is fundamental&lt;/li&gt;
&lt;li&gt;Pub-sub or broadcast patterns are core requirements&lt;/li&gt;
&lt;li&gt;Thread safety without explicit locking is critical&lt;/li&gt;
&lt;li&gt;Transport transparency enables flexible deployment&lt;/li&gt;
&lt;li&gt;Automatic service discovery and reconnection matter&lt;/li&gt;
&lt;li&gt;Development velocity matters -- batteries-included infrastructure&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Use Both When:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Applications have local async logic (coroutines) AND distributed communication (Areg)&lt;/li&gt;
&lt;li&gt;Coroutines handle complex sequential workflows within services&lt;/li&gt;
&lt;li&gt;Areg handles inter-service communication, threading, and distribution&lt;/li&gt;
&lt;li&gt;You want maximum expressiveness for different problem domains&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Getting Started with Areg SDK
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Repository&lt;/strong&gt;: &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;github.com/aregtech/areg-sdk&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Quick Start&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/aregtech/areg-sdk.git
&lt;span class="nb"&gt;cd &lt;/span&gt;areg-sdk
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explore Examples&lt;/strong&gt;:&lt;br&gt;
The &lt;code&gt;examples/&lt;/code&gt; directory contains working systems demonstrating:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Inter-thread, IPC, and network communication&lt;/li&gt;
&lt;li&gt;Pub-sub patterns and broadcasts&lt;/li&gt;
&lt;li&gt;Service discovery and automatic reconnection&lt;/li&gt;
&lt;li&gt;Watchdog and fault tolerance&lt;/li&gt;
&lt;li&gt;Distributed logging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Documentation&lt;/strong&gt;: &lt;a href="https://github.com/aregtech/areg-sdk/wiki" rel="noopener noreferrer"&gt;Areg SDK Wiki&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Different programming models&lt;/strong&gt;: Coroutines provide sequential syntax. Event-driven provides callback-based async messaging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Different problem domains&lt;/strong&gt;: Coroutines excel at local async operations. Event frameworks excel at distributed systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complementary, not competing&lt;/strong&gt;: Use coroutines inside event-driven services for best of both worlds.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Infrastructure investment&lt;/strong&gt;: Coroutines require building custom infrastructure. Areg provides production-ready distributed systems infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Thread safety models&lt;/strong&gt;: Coroutines need manual synchronization. Areg provides architectural thread affinity -- single-threaded component logic in multi-threaded systems.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Distribution support&lt;/strong&gt;: Coroutines have none built-in. Areg has IPC, network, service discovery, and fault tolerance integrated.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose based on architecture&lt;/strong&gt;: For local async, coroutines offer expressive syntax. For distributed systems, event-driven frameworks eliminate enormous complexity.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Understanding both approaches -- and when to use each -- makes you a more effective C++ systems architect.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Further Reading&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/aregtech/areg-sdk/wiki" rel="noopener noreferrer"&gt;Areg SDK Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.cppreference.com/w/cpp/language/coroutines" rel="noopener noreferrer"&gt;C++20 Coroutines - cppreference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/aregtech/areg-sdk/tree/master/examples" rel="noopener noreferrer"&gt;Areg Examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Have questions or feedback? Join the discussion on &lt;a href="https://github.com/aregtech/areg-sdk/issues" rel="noopener noreferrer"&gt;Areg SDK GitHub Issues&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>coroutine</category>
      <category>async</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🚀 Why C Still Matters Even in a C++ World?</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Tue, 14 Oct 2025 12:07:22 +0000</pubDate>
      <link>https://dev.to/aregtech/why-c-still-matters-even-in-a-c-world-1fpp</link>
      <guid>https://dev.to/aregtech/why-c-still-matters-even-in-a-c-world-1fpp</guid>
      <description>&lt;p&gt;Even after decades of C++ evolution, C remains &lt;strong&gt;the foundation of modern computing&lt;/strong&gt;. Operating systems, embedded firmware, drivers, bootloaders, and performance-critical components rely heavily on C. Understanding C’s role, its strengths, and how it interacts with C++ is essential for software engineers at all levels.&lt;/p&gt;

&lt;p&gt;This article explores:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Why C is still relevant
&lt;/li&gt;
&lt;li&gt;Practical examples comparing C and C++
&lt;/li&gt;
&lt;li&gt;Specific things C enables that C++ forbids or handles differently
&lt;/li&gt;
&lt;li&gt;How to combine C and C++ effectively
&lt;/li&gt;
&lt;li&gt;How Areg Framework leverages C and C++ together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you are a beginner learning systems programming or a seasoned engineer, this guide strengthens your foundation.&lt;/p&gt;




&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aspect&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Runtime&lt;/td&gt;
&lt;td&gt;Minimal, predictable&lt;/td&gt;
&lt;td&gt;Adds constructors, destructors, RTTI&lt;/td&gt;
&lt;td&gt;Embedded systems need minimal overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ABI&lt;/td&gt;
&lt;td&gt;Simple, stable, universal&lt;/td&gt;
&lt;td&gt;Mangled for overloading / templates&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;extern "C"&lt;/code&gt; can disable mangling&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Memory&lt;/td&gt;
&lt;td&gt;Direct stack / heap access&lt;/td&gt;
&lt;td&gt;Usually safer, more abstract&lt;/td&gt;
&lt;td&gt;VLAs work in C, need vector in C++&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware access&lt;/td&gt;
&lt;td&gt;Direct memory / register / interrupt&lt;/td&gt;
&lt;td&gt;Requires workarounds or &lt;code&gt;extern "C"&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;C is ideal for low-level firmware&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Abstraction&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;OOP, templates&lt;/td&gt;
&lt;td&gt;C++ is stronger at modular service layer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  1. C as the Foundation
&lt;/h2&gt;

&lt;p&gt;C is often called &lt;strong&gt;the assembly language of high-level programming&lt;/strong&gt;. It is lightweight, predictable, and gives developers direct control over memory and CPU resources.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why systems rely on C&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Stable ABI&lt;/strong&gt; with minimal runtime overhead
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Direct access&lt;/strong&gt; to memory, registers, and interrupts
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Extreme portability&lt;/strong&gt;: microcontrollers, embedded Linux, Windows, macOS, and supercomputers
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Modern C++ applications almost always depend on C libraries, OS kernels, or low-level firmware. Many frameworks build C++ layers on &lt;strong&gt;solid C foundations&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. ABI and Linking: C vs C++
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2.1 C: Simple, Predictable ABI
&lt;/h3&gt;

&lt;p&gt;C’s ABI is &lt;strong&gt;straightforward&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="c1"&gt;// addlib.c&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compiled symbol (&lt;code&gt;nm addlib.o&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0000000000000000 T add
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Symbol &lt;code&gt;add&lt;/code&gt; is &lt;strong&gt;unmangled&lt;/strong&gt;, predictable across compilers&lt;/li&gt;
&lt;li&gt;Can be linked from &lt;strong&gt;C, C++, Rust, Python, Go&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Memory layout is consistent; calling conventions are stable&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This simplicity is crucial for &lt;strong&gt;cross-language libraries, embedded systems, and firmware hooks&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.2 C++: Name Mangling Explained
&lt;/h3&gt;

&lt;p&gt;Now let’s see how C++ achieves the same with stronger typing and linkage control. C++ supports &lt;strong&gt;function overloading, namespaces, and templates&lt;/strong&gt;. To distinguish symbols, compilers &lt;strong&gt;mangle names&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// addlib.cpp&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;double&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Symbol table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;0000000000000000 T _Z3addii   // int add(int,int)
0000000000000010 T _Z3adddd   // double add(double,double)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;_Z3addii&lt;/code&gt; encodes function name, namespace, and parameters&lt;/li&gt;
&lt;li&gt;If C code calls &lt;code&gt;add(int,int)&lt;/code&gt; directly, the linker &lt;strong&gt;cannot find &lt;code&gt;_Z3addii&lt;/code&gt;&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.3 Using &lt;code&gt;extern "C"&lt;/code&gt; to Disable Mangling
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Tells the C++ compiler to use &lt;strong&gt;C linkage&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Prevents mangling&lt;/li&gt;
&lt;li&gt;Required when &lt;strong&gt;C++ exposes functions to C, firmware, or interrupts&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example: C calling C++ function&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* demo.c */&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"3*4=%d&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The C++ code implementation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* multiply.cpp */&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;multiply&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcc &lt;span class="nt"&gt;-c&lt;/span&gt; demo.c
g++ &lt;span class="nt"&gt;-c&lt;/span&gt; multiply.cpp
g++ demo.o multiply.c.o &lt;span class="nt"&gt;-o&lt;/span&gt; demo_app
./demo_app
&lt;span class="c"&gt;# Output: 3*4=12&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Without &lt;code&gt;extern "C"&lt;/code&gt;, &lt;strong&gt;linker errors occur&lt;/strong&gt; because C++ mangled symbols don’t match plain C symbols.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.4 When You Can Ignore &lt;code&gt;extern "C"&lt;/code&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Calling &lt;strong&gt;C++ functions from C++ code&lt;/strong&gt; in the same project&lt;/li&gt;
&lt;li&gt;No overloading or templates required&lt;/li&gt;
&lt;li&gt;Internal C++ modules where symbol mangling is acceptable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  3. Minimal Runtime Overhead
&lt;/h2&gt;

&lt;p&gt;C’s runtime is almost nonexistent:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;puts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello C!"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile minimal binary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcc &lt;span class="nt"&gt;-nostdlib&lt;/span&gt; hello.c &lt;span class="nt"&gt;-o&lt;/span&gt; hello
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ introduces runtime for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Constructors/destructors&lt;/li&gt;
&lt;li&gt;Exception handling&lt;/li&gt;
&lt;li&gt;RTTI (type information)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even trivial C++ programs pull extra bytes. For &lt;strong&gt;embedded systems or performance-critical modules&lt;/strong&gt;, this matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Direct Hardware Access and Interrupt
&lt;/h2&gt;

&lt;p&gt;C allows &lt;strong&gt;memory-mapped I/O, register manipulation, and interrupts&lt;/strong&gt;. Direct hardware access and interrupt handling are fully available in C++ low-level programming, though the syntax differs slightly. The following examples show how both C and C++ can achieve the same functionality.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 &lt;strong&gt;C Version&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#define LED_PORT   (*(volatile uint32_t*)0x40021018U)
#define NVIC_ISER0 (*(volatile uint32_t*)0xE000E100U)
#define IRQ_LINE 5
&lt;/span&gt;
&lt;span class="c1"&gt;// Interrupt Service Routine (ISR)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;interrupt&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="n"&gt;my_irq_handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LED_PORT&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="mh"&gt;0x1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Toggle LED&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interrupt vector table&lt;/span&gt;
&lt;span class="n"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".isr_vector"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;vector_table&lt;/span&gt;&lt;span class="p"&gt;[])(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="mh"&gt;0x20001000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Initial stack pointer&lt;/span&gt;
    &lt;span class="n"&gt;my_irq_handler&lt;/span&gt;              &lt;span class="c1"&gt;// ISR for IRQ_LINE&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NVIC_ISER0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1U&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;IRQ_LINE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Enable interrupt&lt;/span&gt;
    &lt;span class="n"&gt;LED_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                &lt;span class="c1"&gt;// Turn LED on&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Main loop, do other tasks&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;LED_PORT&lt;/code&gt; is a &lt;strong&gt;direct memory-mapped register&lt;/strong&gt;, declared as &lt;code&gt;volatile&lt;/code&gt; to prevent compiler optimizations that could skip hardware writes.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;my_irq_handler&lt;/code&gt; is the &lt;strong&gt;Interrupt Service Routine (ISR)&lt;/strong&gt;  --  a function automatically called when the interrupt occurs.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;vector_table&lt;/code&gt; is placed in a dedicated &lt;code&gt;.isr_vector&lt;/code&gt; section so the hardware knows where to find the ISR.&lt;/li&gt;
&lt;li&gt;The main loop simply initializes the LED and keeps the program running.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4.2 &lt;strong&gt;C++ Version&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstdint&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="cp"&gt;#define LED_PORT_ADDR 0x40021018U
&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;LED_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;volatile&lt;/span&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LED_PORT_ADDR&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="cp"&gt;#define NVIC_ISER0 (*(volatile uint32_t*)0xE000E100U)
&lt;/span&gt;&lt;span class="k"&gt;constexpr&lt;/span&gt; &lt;span class="kt"&gt;uint32_t&lt;/span&gt; &lt;span class="n"&gt;IRQ_LINE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// ISR must use extern "C" to prevent C++ name mangling&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;my_irq_handler&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;LED_PORT&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="mh"&gt;0x1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Toggle LED&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Interrupt vector table&lt;/span&gt;
&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;vector_table&lt;/span&gt;&lt;span class="p"&gt;[])(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;__attribute__&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;section&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;".isr_vector"&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="mh"&gt;0x20001000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// Initial stack pointer&lt;/span&gt;
    &lt;span class="n"&gt;my_irq_handler&lt;/span&gt;              &lt;span class="c1"&gt;// ISR for IRQ_LINE&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;NVIC_ISER0&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1U&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;IRQ_LINE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Enable interrupt&lt;/span&gt;
    &lt;span class="n"&gt;LED_PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;                &lt;span class="c1"&gt;// Initialize LED&lt;/span&gt;

    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Main loop, do other tasks&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Explanation:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;volatile uint32_t&amp;amp; LED_PORT&lt;/code&gt; replaces the C macro with a &lt;strong&gt;typed reference&lt;/strong&gt;, making the access safer and clearer.&lt;/li&gt;
&lt;li&gt;The ISR is declared with &lt;code&gt;extern "C"&lt;/code&gt; to avoid &lt;strong&gt;name mangling&lt;/strong&gt;, which would otherwise make it invisible to the hardware interrupt vector.&lt;/li&gt;
&lt;li&gt;Apart from that, the structure (vector table, interrupt setup, and main loop) is nearly identical to the C version.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  4.3 &lt;strong&gt;Key Takeaways&lt;/strong&gt;
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Direct memory access&lt;/strong&gt; works identically in both C and C++.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interrupt Service Routines (ISRs)&lt;/strong&gt; require &lt;code&gt;extern "C"&lt;/code&gt; in C++ for correct hardware linkage.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Program flow&lt;/strong&gt;  --  enabling interrupts, toggling LEDs, and looping  --  remains exactly the same.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C++ syntax&lt;/strong&gt; adds safety and clarity (e.g., references, &lt;code&gt;constexpr&lt;/code&gt;), while maintaining the same low-level control.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These examples prove that C++ can handle the same bare-metal tasks as C -- direct register access, interrupt handling, and vector table definition, while giving developers more expressive tools for scaling complexity as projects evolve.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. Predictability vs Abstraction
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;C code is explicit&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%s&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="n"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"C is predictable."&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;C++ adds hidden layers&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;print_message&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;msg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;msg&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Constructors, destructors, iostream buffering, and locale handling execute automatically&lt;/li&gt;
&lt;li&gt;C gives &lt;strong&gt;deterministic behavior&lt;/strong&gt;, ideal for debugging, low-level timing, and embedded systems&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  6. What C Can Do That C++ Cannot (or Does Differently)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;C&lt;/th&gt;
&lt;th&gt;C++&lt;/th&gt;
&lt;th&gt;Workaround / Alternative&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Variable-length arrays (VLA)&lt;/td&gt;
&lt;td&gt;✅ stack allocation&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;std::vector&lt;/code&gt; (heap)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Compound literals&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (C++11+)&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;Point{...}&lt;/code&gt; in C++11+&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Designated initializers&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;✅ (C++20+)&lt;/td&gt;
&lt;td&gt;Pre-C++20: constructor or ordered init&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implicit &lt;code&gt;void*&lt;/code&gt; conversions&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;Explicit cast &lt;code&gt;(int*)malloc(...)&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexible function pointer casts&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;td&gt;⚠️&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;reinterpret_cast&lt;/code&gt; in C++&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Examples
&lt;/h3&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 1: Variable-length arrays (stack)&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;C Version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// stack allocation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ alternative (heap allocation):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;vector&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;arr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="c1"&gt;// heap allocation&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 2: Compound literals&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;C Version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt; &lt;span class="c1"&gt;// legal in C&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ Version (since C++11):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;draw&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Point&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  &lt;strong&gt;Example 3: Designated initializers&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;C Version (since C99):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;baud&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;parity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Designated initializers in C&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ Version (since C++20):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Designated initializers in C++20&lt;/span&gt;
    &lt;span class="n"&gt;Config&lt;/span&gt; &lt;span class="n"&gt;cfg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;baud&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;9600&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;parity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The results of both examples are the same, but before C++20 &lt;strong&gt;Designated Initializers&lt;/strong&gt; were not available.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 4: Implicit &lt;code&gt;void*&lt;/code&gt;&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;C Version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// C implicit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ Version (explicit cast required):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;static_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;*&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;malloc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nf"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)));&lt;/span&gt; &lt;span class="c1"&gt;// C++ explicit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❗ &lt;strong&gt;C++-preferred way:&lt;/strong&gt; Use &lt;code&gt;new&lt;/code&gt; and &lt;code&gt;delete&lt;/code&gt; or standard containers (&lt;code&gt;std::vector&lt;/code&gt;, &lt;code&gt;std::array&lt;/code&gt;) for safer memory management.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;strong&gt;Example 5: Flexible function pointer casting&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;C Version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fp1&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="mh"&gt;0x08000000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// C direct&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fp2&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="n"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// cast between incompatible function pointer types&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;C++ Version (requires &lt;code&gt;reinterpret_cast&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fp1&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)()&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x08000000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;fp2&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;reinterpret_cast&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;❗ &lt;strong&gt;Correct and portable C++ version:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;functional&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Define a wrapper to adapt signatures safely&lt;/span&gt;
    &lt;span class="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;wrapper&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;say_hello&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;safe_ptr&lt;/span&gt;&lt;span class="p"&gt;)(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;wrapper&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// use unary + to convert lambda to function pointer&lt;/span&gt;

    &lt;span class="n"&gt;safe_ptr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// safe and portable&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  7. Combining C and C++: Mini Demo
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight c"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* addlib.c */&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cm"&gt;/* demo.cpp */&lt;/span&gt;
&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="k"&gt;extern&lt;/span&gt; &lt;span class="s"&gt;"C"&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"2+3="&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Compile:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gcc &lt;span class="nt"&gt;-c&lt;/span&gt; addlib.c
g++ demo.cpp addlib.o &lt;span class="nt"&gt;-o&lt;/span&gt; demo_app
./demo_app
&lt;span class="c"&gt;# Output: 2+3=5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Shows predictable C ABI integration into C++&lt;/li&gt;
&lt;li&gt;Example is fully buildable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  8. When and Why to Use C vs C++
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;C&lt;/strong&gt;: low-level, firmware, drivers, cross-language modules, predictable ABI&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C++&lt;/strong&gt;: application logic, complex and distributed systems, modular applications and services&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Insight:&lt;/strong&gt; C is the “steel frame”; C++ is the architectural design layered on top. Use C for stability and minimal overhead; C++ for abstraction and modularity.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. Promoting Areg SDK
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Areg Framework&lt;/strong&gt; is the heart of &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Areg SDK&lt;/strong&gt;&lt;/a&gt; -- an open-source C++ framework designed to bring &lt;strong&gt;modern, service-oriented architecture&lt;/strong&gt; to systems built on solid C foundations.&lt;/p&gt;

&lt;p&gt;If your system runs &lt;strong&gt;C-based Linux&lt;/strong&gt;, but you want a &lt;strong&gt;clean, modular, C++ layer&lt;/strong&gt; for service-oriented distributed, multithreading and multiprocessing embedded and desktop applications, Areg SDK is your bridge. It lets you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retain &lt;strong&gt;deterministic C performance&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Build &lt;strong&gt;reusable, modular C++ services&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scale systems without rewriting the low-level firmware
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For &lt;strong&gt;Zephyr RTOS&lt;/strong&gt;, upcoming support will allow developers to create &lt;strong&gt;structured C++ services&lt;/strong&gt; on real-time systems. The community is welcome to &lt;strong&gt;watch the repo, contribute, or help accelerate Zephyr integration&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why Areg SDK is Different
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Predictable, minimal C foundation&lt;/strong&gt;  --  no hidden runtime overhead, ideal for firmware and embedded modules.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service-oriented C++ layers&lt;/strong&gt;  --  reusable service objects, clean separation of concerns, and easier scaling.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-platform design&lt;/strong&gt;  --  works across embedded Linux, desktops, Windows and virtualized environments.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Future-proof architecture&lt;/strong&gt;  --  structured C++ services on RTOS, enabling safe and maintainable distributed systems.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; With Areg SDK, you get the &lt;strong&gt;stability and control of C&lt;/strong&gt; plus the &lt;strong&gt;abstraction and modularity of C++&lt;/strong&gt;, enabling scalable, maintainable, and high-performance applications.&lt;/p&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Explore Areg SDK on GitHub&lt;/strong&gt;&lt;/a&gt;, run examples to check features.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Final Thoughts
&lt;/h2&gt;

&lt;p&gt;C is foundational; C++ builds upon it. Understanding both, and &lt;strong&gt;when to use each&lt;/strong&gt;, makes you a more effective engineer. Build &lt;strong&gt;strong C foundations&lt;/strong&gt;, then scale with C++ services for maintainable, high-performance software.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>c</category>
      <category>programming</category>
      <category>learning</category>
    </item>
    <item>
      <title>🐛Bug-Free Multithreading: How Areg SDK Transforms Concurrency in C++</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Wed, 08 Oct 2025 08:11:29 +0000</pubDate>
      <link>https://dev.to/aregtech/bug-free-multithreading-how-areg-sdk-transforms-concurrency-in-c-4m1d</link>
      <guid>https://dev.to/aregtech/bug-free-multithreading-how-areg-sdk-transforms-concurrency-in-c-4m1d</guid>
      <description>&lt;p&gt;&lt;strong&gt;Threads:&lt;/strong&gt; the #1 headache in C++ projects. They promise performance but often deliver &lt;strong&gt;race conditions, deadlocks, and debugging nightmares&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;If you’ve ever wrestled with &lt;code&gt;std::thread&lt;/code&gt;, mutexes, or async callbacks, you know what I mean. Concurrency is one of the toughest challenges in software engineering — and many C++ projects fail because of it.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why Traditional C++ Threads Fail
&lt;/h2&gt;

&lt;p&gt;Even with decades of frameworks and libraries, threading in C++ remains tricky:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Manual synchronization&lt;/strong&gt; → mutexes, condition variables, atomics. Easy to misuse, hard to debug.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hidden race conditions&lt;/strong&gt; → bugs that appear only under high load.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Callback spaghetti&lt;/strong&gt; → async code quickly turns into unreadable chains.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Threads + IPC = chaos&lt;/strong&gt; → inter-process communication multiplies complexity.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Yes, you can use &lt;code&gt;std::thread&lt;/code&gt;, Boost.Asio, or gRPC — but managing threads, queues, and IPC manually is still &lt;strong&gt;painful, error-prone, and slow&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Meet Areg SDK: Concurrency Made Easy
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Areg SDK&lt;/a&gt; removes the headache of threads. Instead of juggling mutexes and message queues, you define &lt;strong&gt;services&lt;/strong&gt; and their relationships — the framework handles &lt;strong&gt;threading, communication, and synchronization automatically&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Advantages
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;strong&gt;Automatic threading&lt;/strong&gt; — every service runs in its own thread.
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Async RPC &amp;amp; Pub/Sub&lt;/strong&gt; — no locks or queues to manage.
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Unified API&lt;/strong&gt; — works across threads, processes, and devices.
&lt;/li&gt;
&lt;li&gt;✅ &lt;strong&gt;Failure isolation&lt;/strong&gt; — if a service crashes, the mesh recovers automatically.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With Areg SDK, you focus on &lt;strong&gt;business logic&lt;/strong&gt;, not thread safety.&lt;/p&gt;




&lt;h2&gt;
  
  
  From Threads to Services: Real Example
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Traditional C++ threading:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="nf"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_lock&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;processData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sharedQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;front&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
        &lt;span class="n"&gt;sharedQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pop&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With Areg SDK:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Service Consumer calls Provider asynchronously&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"payload"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The service provider automatically runs in its own thread:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ServiceProvider&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;requestData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// business logic&lt;/span&gt;
    &lt;span class="n"&gt;responseData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;💡 No mutexes, no queues, no manual thread management. You simply define a &lt;strong&gt;model&lt;/strong&gt; describing threads and services:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;BEGIN_MODEL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ServiceModel"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;BEGIN_REGISTER_THREAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Thread1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;BEGIN_REGISTER_COMPONENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ServiceProvider"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ServiceProvider&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;REGISTER_IMPLEMENT_SERVICE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NEHelloService&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;ServiceName&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;NEHelloService&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;InterfaceVersion&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;END_REGISTER_COMPONENT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;END_REGISTER_THREAD&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="n"&gt;BEGIN_REGISTER_THREAD&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Thread2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;BEGIN_REGISTER_COMPONENT&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ServiceClient"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ServiceConsumer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;REGISTER_DEPENDENCY&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"ServiceProvider"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;END_REGISTER_COMPONENT&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;END_REGISTER_THREAD&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;END_MODEL&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Load the model with a single line: &lt;code&gt;Application::loadModel("ServiceModel");&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's it!&lt;/strong&gt; The framework &lt;strong&gt;instantiates threads, synchronizes access, and delivers results asynchronously&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;👉 See a full working example: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/01_minimalrpc/src/main.cpp" rel="noopener noreferrer"&gt;01_minimalrpc&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Areg SDK Matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Eliminate race conditions&lt;/strong&gt; → fewer bugs, safer code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Boost productivity&lt;/strong&gt; → less boilerplate, more focus on features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scale naturally&lt;/strong&gt; → same API across threads, processes, and devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Resilient by design&lt;/strong&gt; → failures don’t crash the system.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Areg SDK isn’t just about faster code — it’s about &lt;strong&gt;writing production-ready systems without threading nightmares&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  How It Compares
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Areg SDK&lt;/th&gt;
&lt;th&gt;Traditional Frameworks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thread Management&lt;/td&gt;
&lt;td&gt;✅ Automatic&lt;/td&gt;
&lt;td&gt;⚠️ Manual threading&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency Safety&lt;/td&gt;
&lt;td&gt;✅ Built-in messaging&lt;/td&gt;
&lt;td&gt;⚠️ Locks, queues, risks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local/Remote Calls&lt;/td&gt;
&lt;td&gt;✅ Unified API&lt;/td&gt;
&lt;td&gt;⚠️ Split local vs remote&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Failure Isolation&lt;/td&gt;
&lt;td&gt;✅ Self-healing mesh&lt;/td&gt;
&lt;td&gt;⚠️ Process-wide failures&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  Takeaway
&lt;/h2&gt;

&lt;p&gt;Most C++ projects fail not because of algorithms, but because of &lt;strong&gt;threads and fragile wiring&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Areg SDK turns threads into &lt;strong&gt;safe, asynchronous services&lt;/strong&gt; — local or remote — letting you focus on building features, not fixing concurrency bugs.&lt;/p&gt;

&lt;p&gt;🚀 Explore the &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/01_minimalrpc/" rel="noopener noreferrer"&gt;&lt;code&gt;01_minimalrpc&lt;/code&gt;&lt;/a&gt; example and see how &lt;strong&gt;Areg SDK replaces threads and locks with clean, service-oriented code&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
⭐ If this helps you write bug-free multithreaded C++ code, &lt;strong&gt;star the repo&lt;/strong&gt;: &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;aregtech/areg-sdk&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>programming</category>
      <category>distributedsystems</category>
      <category>productivity</category>
    </item>
    <item>
      <title>[Question] Is Dev.to banned at Reddit?</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Mon, 06 Oct 2025 12:15:55 +0000</pubDate>
      <link>https://dev.to/aregtech/question-is-devto-banned-at-reddit-4jkd</link>
      <guid>https://dev.to/aregtech/question-is-devto-banned-at-reddit-4jkd</guid>
      <description>&lt;p&gt;Suddenly refreshed a &lt;a href="https://www.reddit.com/r/DevTo/" rel="noopener noreferrer"&gt;Dev.to community link&lt;/a&gt; at reddit and have seen this message:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxufqq1dwezb5d1hnrvlv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxufqq1dwezb5d1hnrvlv.png" alt=" " width="659" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Just think, what could the community doing wrong that Reddit decides to ban?&lt;/p&gt;

</description>
      <category>devto</category>
      <category>reddit</category>
    </item>
    <item>
      <title>🔑 One Lock to Rule Them All: Mixed Sync MultiLock</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Wed, 01 Oct 2025 13:43:30 +0000</pubDate>
      <link>https://dev.to/aregtech/multilock-in-areg-sdk-portable-efficient-mixed-synchronization-in-c-4oa0</link>
      <guid>https://dev.to/aregtech/multilock-in-areg-sdk-portable-efficient-mixed-synchronization-in-c-4oa0</guid>
      <description>&lt;p&gt;In multithreaded applications, threads rarely wait for just &lt;strong&gt;one condition&lt;/strong&gt;. More often, they need to coordinate across &lt;strong&gt;resources&lt;/strong&gt; (mutexes) and &lt;strong&gt;signals&lt;/strong&gt; (events), sometimes with semaphores or timers thrown into the mix.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Classic challenge&lt;/em&gt;: how do you &lt;strong&gt;wait for a resource without missing a shutdown signal&lt;/strong&gt;, all while avoiding busy loops, race conditions, or verbose boilerplate?&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The answer&lt;/em&gt;: &lt;strong&gt;Areg’s MultiLock&lt;/strong&gt; — a &lt;strong&gt;portable, mixed-object wait primitive&lt;/strong&gt; that works on Windows and Linux. It handles &lt;strong&gt;Mutex, SynchEvent, Semaphore, and Waitable Timers&lt;/strong&gt; in one unified API. MultiLock isn’t a luxury — it’s a &lt;strong&gt;critical tool for efficiency and clarity&lt;/strong&gt; in real-world multithreading.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why MultiLock is Not Optional
&lt;/h2&gt;

&lt;p&gt;Without MultiLock, developers face these recurring problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Racey flags:&lt;/strong&gt; Threads constantly check booleans or condition variables to see if they should proceed or shutdown.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Busy-wait loops:&lt;/strong&gt; Polling locks repeatedly wastes CPU.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Verbose STL workarounds:&lt;/strong&gt; Combining &lt;code&gt;std::condition_variable&lt;/code&gt; + &lt;code&gt;std::unique_lock&lt;/code&gt; + &lt;code&gt;std::try_lock&lt;/code&gt; for multiple mutexes is error-prone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Platform inconsistencies:&lt;/strong&gt; Windows has &lt;code&gt;WaitForMultipleObjects&lt;/code&gt;, but POSIX lacks a single call to wait on heterogeneous objects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;MultiLock solves all of this elegantly:&lt;/strong&gt; one call, cross-platform, no polling, predictable behavior.&lt;/p&gt;




&lt;h2&gt;
  
  
  Real-World Use Cases
&lt;/h2&gt;

&lt;p&gt;Here are practical scenarios where MultiLock shines:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Graceful worker shutdown while holding a mutex&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A thread waits for a resource (mutex) but must exit immediately if a shutdown event is signaled.&lt;/li&gt;
&lt;li&gt;MultiLock handles both in one call, avoiding fragile loops.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Interruptible multi-resource acquisition&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Tasks that need multiple mutexes to operate (e.g., swap buffers or update multiple shared structures).&lt;/li&gt;
&lt;li&gt;With MultiLock, you can cancel or preempt acquisition if a cancellation event fires.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service startup with dependency gating&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Startup requires a config to load (event), a license token (semaphore), and exclusive access to an init resource (mutex).&lt;/li&gt;
&lt;li&gt;MultiLock waits until all conditions are satisfied, with optional &lt;strong&gt;wait-any&lt;/strong&gt; or &lt;strong&gt;wait-all&lt;/strong&gt; modes.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Thread pool cancellation and resource fairness&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Multiple threads contend for shared resources. MultiLock allows a &lt;strong&gt;global stop signal&lt;/strong&gt; without losing mutex guarantees or fairness.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Compact Code Example — Share Resources and Shutdown Thread
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Mixed objects: two mutexes + shutdown event&lt;/span&gt;
&lt;span class="n"&gt;IESynchObject&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;shutdownEvent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutexA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mutexB&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="n"&gt;MultiLock&lt;/span&gt; &lt;span class="nf"&gt;multiLock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MACRO_ARRAYLEN&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;objects&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// wait-any&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;multiLock&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;NECommon&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;WAIT_INFINITE&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Shutdown event signaled → abort gracefully&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;index&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Resource mutex available → proceed with work&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Full working example (events, mutexes) is in &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/10_synch/src/main.cpp" rel="noopener noreferrer"&gt;&lt;strong&gt;10_synch demo&lt;/strong&gt;&lt;/a&gt; of &lt;a href="https://github.com/aregtech/areg-sdk/" rel="noopener noreferrer"&gt;areg-sdk&lt;/a&gt; repo at GitHub.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  STL vs Areg's MultiLock — Complexity Comparison
&lt;/h2&gt;

&lt;p&gt;Even with &lt;code&gt;std::scoped_lock&lt;/code&gt; and &lt;code&gt;std::condition_variable&lt;/code&gt;, standard C++ cannot wait &lt;strong&gt;on a mutex AND a shutdown event&lt;/strong&gt; in a single call. You must:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use try-lock loops&lt;/li&gt;
&lt;li&gt;Periodically check a shutdown flag&lt;/li&gt;
&lt;li&gt;Combine with condition variables&lt;/li&gt;
&lt;li&gt;Avoid deadlocks manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Example sketch:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="n"&gt;mA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;shutdownMutex&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;condition_variable&lt;/span&gt; &lt;span class="n"&gt;shutdownCv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;shutdown&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;while&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_lock&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;sh_lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shutdownMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;shutdown&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;scoped_lock&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mA&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mB&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// blocks until both mutexes acquired&lt;/span&gt;
    &lt;span class="c1"&gt;// cannot be preempted by shutdown directly → need try_lock loops&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Why MultiLock wins:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One call to wait on multiple heterogeneous objects&lt;/li&gt;
&lt;li&gt;Immediate reaction to shutdown signals&lt;/li&gt;
&lt;li&gt;Less code, fewer bugs, higher efficiency&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ASCII Diagram — How MultiLock Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Thread
  |
  v
[ MultiLock(objects: ShutdownEvent, MutexA, MutexB) ]
         |
         +---&amp;gt; ShutdownEvent  --&amp;gt; exit thread
         |
         +---&amp;gt; MutexA ready  --&amp;gt; proceed
         |
         +---&amp;gt; MutexB ready  --&amp;gt; proceed
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Comparison Table — Clear, Verified
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;API / Framework&lt;/th&gt;
&lt;th&gt;Mixed multi-wait?&lt;/th&gt;
&lt;th&gt;Portability&lt;/th&gt;
&lt;th&gt;Notes&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Areg SDK MultiLock&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;✅ Cross-platform&lt;/td&gt;
&lt;td&gt;Mutex, SynchEvent, Semaphore, Waitable Timer — unified, efficient API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Win32 &lt;code&gt;WaitForMultipleObjects&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;✅ Yes&lt;/td&gt;
&lt;td&gt;❌ Windows-only&lt;/td&gt;
&lt;td&gt;Accepts event, mutex, semaphore, thread, timer handles.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;POSIX pthreads&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;❌ Unix-like&lt;/td&gt;
&lt;td&gt;Must combine condvars + mutex manually.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;C++ STL (&lt;code&gt;mutex&lt;/code&gt;, &lt;code&gt;condvar&lt;/code&gt;)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;❌ No&lt;/td&gt;
&lt;td&gt;✅ Cross-platform&lt;/td&gt;
&lt;td&gt;No direct single-call mixed-object wait; must emulate with try_lock + condition_variable.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Boost.Thread / Futures&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;⚠️ Partial&lt;/td&gt;
&lt;td&gt;✅ Cross-platform&lt;/td&gt;
&lt;td&gt;Async composition possible, but no OS-level synchronous mixed-object wait.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;✅ Efficiency takeaway: MultiLock is not a luxury. It &lt;strong&gt;reduces CPU cycles&lt;/strong&gt;, &lt;strong&gt;avoids polling&lt;/strong&gt;, &lt;strong&gt;prevents racey manual loops&lt;/strong&gt;, and provides &lt;strong&gt;one clean abstraction&lt;/strong&gt; for a common yet previously cumbersome problem.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Extra Notes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Waitable Timers:&lt;/strong&gt; integrate easily for deadlines (e.g., stop if a timeout occurs) — behaves consistently across Windows/Linux.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Wait-any vs Wait-all:&lt;/strong&gt; choose whether you want to wake on the first object or all objects ready.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Index-based results:&lt;/strong&gt; you know precisely which object caused the wake-up.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Call to Action
&lt;/h2&gt;

&lt;p&gt;👉 See MultiLock in a real-world scenario: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/10_synch/src/main.cpp" rel="noopener noreferrer"&gt;10_synch example in Areg Framework&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💡If MultiLock looks like the tool you wish you had earlier, show support by &lt;strong&gt;starring&lt;/strong&gt; the repo: &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;⭐ Star areg-sdk on GitHub&lt;/a&gt;  &lt;/p&gt;

&lt;p&gt;Your star helps grow the community and fuels cleaner, safer, and truly cross-platform C++ concurrency.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>programming</category>
      <category>multithreading</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Missing in Modern C++? Event Synchronization Primitive — Areg vs STL vs POCO vs Win32 API</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Tue, 23 Sep 2025 00:04:38 +0000</pubDate>
      <link>https://dev.to/aregtech/missing-in-modern-c-event-synchronization-primitive-with-working-examples-56h9</link>
      <guid>https://dev.to/aregtech/missing-in-modern-c-event-synchronization-primitive-with-working-examples-56h9</guid>
      <description>&lt;p&gt;If you’ve ever struggled with mutexes, predicates, and spurious wakeups in C++ multithreaded code, you know how much time can be lost managing synchronization instead of solving real problems. Here’s a simpler, more predictable approach.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;std::condition_variable&lt;/code&gt; is powerful, but it’s &lt;strong&gt;verbose, fragile, and full of boilerplate&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Check the official example in &lt;a href="https://en.cppreference.com/w/cpp/thread/condition_variable.html" rel="noopener noreferrer"&gt;cppreference&lt;/a&gt;: mutexes, predicates, loops, unlock/relock dance — and still you’re exposed to &lt;strong&gt;spurious wakeups&lt;/strong&gt; (&lt;a href="https://en.cppreference.com/w/cpp/thread/condition_variable#Notes" rel="noopener noreferrer"&gt;proof&lt;/a&gt;). Boost and Qt inherit the same quirks.&lt;/p&gt;

&lt;p&gt;For developers seeking a &lt;strong&gt;straightforward signaling primitive&lt;/strong&gt;, Windows long offered &lt;strong&gt;Event objects&lt;/strong&gt;, with auto-reset and manual-reset semantics to directly signal threads.&lt;/p&gt;

&lt;p&gt;The &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Areg Framework&lt;/strong&gt;&lt;/a&gt; brings the same concept to &lt;strong&gt;cross-platform C++&lt;/strong&gt;: SynchEvent, a lightweight, developer-friendly multithreading primitive that behaves like Windows Events and works well even in embedded systems.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why SynchEvent?
&lt;/h2&gt;

&lt;p&gt;Think of it as a &lt;strong&gt;direct C++ event primitive&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ No spurious wakeups
&lt;/li&gt;
&lt;li&gt;✅ No predicate gymnastics
&lt;/li&gt;
&lt;li&gt;✅ No unlock/relock pitfalls
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Just &lt;strong&gt;signal and wait&lt;/strong&gt; — with both &lt;strong&gt;auto-reset&lt;/strong&gt; and &lt;strong&gt;manual-reset&lt;/strong&gt; semantics, like Windows Events.&lt;/p&gt;




&lt;h2&gt;
  
  
  Key Features
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;SynchEvent&lt;/code&gt; is modeled after Windows Events, but works on &lt;strong&gt;Linux and Windows alike&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Auto-reset&lt;/strong&gt; → wakes exactly one thread, then resets automatically
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Manual-reset&lt;/strong&gt; → wakes &lt;em&gt;all&lt;/em&gt; waiters until reset
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Persistent state&lt;/strong&gt; → no lost signals (signal-before-wait still wakes)
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Straightforward API&lt;/strong&gt; → &lt;code&gt;lock()&lt;/code&gt;, &lt;code&gt;unlock()&lt;/code&gt;, &lt;code&gt;setEvent()&lt;/code&gt;, &lt;code&gt;resetEvent()&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No extra flags, mutexes, or predicate loops required.&lt;/p&gt;




&lt;h2&gt;
  
  
  Auto-reset vs Manual-reset (visual)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Auto-reset (wake ONE, then reset):
   [Thread A waits] ---+
   [Thread B waits] ---+--&amp;gt; Signal --&amp;gt; wakes one thread --&amp;gt; reset

Manual-reset (wake ALL until reset):
   [Thread A waits] ---+
   [Thread B waits] ---+--&amp;gt; Signal --&amp;gt; wakes all threads --&amp;gt; stays signaled
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Code Comparison
&lt;/h2&gt;

&lt;h3&gt;
  
  
  With &lt;code&gt;std::condition_variable&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://en.cppreference.com/w/cpp/thread/condition_variable" rel="noopener noreferrer"&gt;Example from cppreference&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;mutex&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;condition_variable&lt;/span&gt; &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kt"&gt;bool&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_lock&lt;/span&gt; &lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" processed"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;processed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;unlock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify_one&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Example"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt; 
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;lock_guard&lt;/span&gt; &lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;ready&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify_one&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

    &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;unique_lock&lt;/span&gt; &lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;cv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;wait&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;lk&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]{&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// check processed&lt;/span&gt;
    &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  With &lt;code&gt;SynchEvent&lt;/code&gt; (Areg SDK)
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/28_stlsynch/src/main.cpp" rel="noopener noreferrer"&gt;Full example here&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"areg/base/SynchObjects.hpp"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="n"&gt;SynchEvent&lt;/span&gt;  &lt;span class="nf"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// non-signaled, auto-reset event&lt;/span&gt;
&lt;span class="n"&gt;SynchEvent&lt;/span&gt;  &lt;span class="nf"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;false&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// non-signaled, manual-reset event&lt;/span&gt;
&lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;{};&lt;/span&gt;                 &lt;span class="c1"&gt;// A text to output&lt;/span&gt;

&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;workerThread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Lock&lt;/span&gt; &lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="s"&gt;" processed"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="c1"&gt;// we own the lock&lt;/span&gt;
    &lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setEvent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;  &lt;span class="c1"&gt;// manual set event&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Example"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="kr"&gt;thread&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;workerThread&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;ready&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setEvent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// signal the worker thread&lt;/span&gt;
    &lt;span class="n"&gt;processed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lock&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;   &lt;span class="c1"&gt;// wait for worker thread to signal&lt;/span&gt;
    &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// check processed&lt;/span&gt;
    &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 Notice the difference: &lt;strong&gt;no flags, no spurious wakeups, no lock dance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Two more examples worth checking out:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/10_synch/src/main.cpp" rel="noopener noreferrer"&gt;&lt;strong&gt;10_synch&lt;/strong&gt;&lt;/a&gt;: demonstrates waiting on multiple mixed synchronization objects like &lt;code&gt;SynchEvent&lt;/code&gt; and &lt;code&gt;Mutex&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/29_synchevent/src/main.cpp" rel="noopener noreferrer"&gt;&lt;strong&gt;29_synchevent&lt;/strong&gt;&lt;/a&gt;: shows that with Areg, an &lt;strong&gt;auto-reset event never loses its signal&lt;/strong&gt;. If set while no thread is waiting, the signal is preserved until one thread consumes it.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Together, these examples underline two pain points that &lt;code&gt;std::condition_variable&lt;/code&gt; and many other frameworks fail to solve:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Areg enables waiting on mixed synchronization objects;
&lt;/li&gt;
&lt;li&gt;Areg guarantees signals are not lost if no thread is ready.
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Clone the repo and see the difference yourself.&lt;/strong&gt;&lt;/p&gt;




&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Areg SynchEvent&lt;/th&gt;
&lt;th&gt;STL STD::CV&lt;/th&gt;
&lt;th&gt;Win32 Event&lt;/th&gt;
&lt;th&gt;POCO::Event&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Auto-reset&lt;/td&gt;
&lt;td&gt;✅ Wakes one thread&lt;/td&gt;
&lt;td&gt;⚠️ &lt;a href="https://en.cppreference.com/w/cpp/thread/condition_variable#Example" rel="noopener noreferrer"&gt;Manual logic&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;✅ Wakes one&lt;/td&gt;
&lt;td&gt;⚠️ ️POSIX &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;unverified&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Manual-reset&lt;/td&gt;
&lt;td&gt;✅ Wakes all threads&lt;/td&gt;
&lt;td&gt;❌ Not supported&lt;/td&gt;
&lt;td&gt;✅ Wakes all&lt;/td&gt;
&lt;td&gt;⚠️ POSIX &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;unverified&lt;/a&gt; on POSIX&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Initial state&lt;/td&gt;
&lt;td&gt;✅ Persistent&lt;/td&gt;
&lt;td&gt;❌ Not persistent&lt;/td&gt;
&lt;td&gt;✅ Persistent&lt;/td&gt;
&lt;td&gt;⚠️ POSIX &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;unverified&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reliable wakeups&lt;/td&gt;
&lt;td&gt;✅ Guaranteed&lt;/td&gt;
&lt;td&gt;⚠️ &lt;a href="https://en.cppreference.com/w/cpp/thread/condition_variable#Notes" rel="noopener noreferrer"&gt;Spurious&lt;/a&gt; possible&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://learn.microsoft.com/en-us/windows/win32/sync/event-objects" rel="noopener noreferrer"&gt;Guaranteed&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;⚠️ POSIX &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;unverified&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Boilerplate&lt;/td&gt;
&lt;td&gt;✅ Minimal API&lt;/td&gt;
&lt;td&gt;⚠️ Verbose&lt;/td&gt;
&lt;td&gt;✅ Low&lt;/td&gt;
&lt;td&gt;✅ Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-event wait&lt;/td&gt;
&lt;td&gt;✅ Native support&lt;/td&gt;
&lt;td&gt;❌ Complex&lt;/td&gt;
&lt;td&gt;✅ &lt;a href="https://learn.microsoft.com/en-us/windows/win32/sync/waitformultipleobjects" rel="noopener noreferrer"&gt;Supported&lt;/a&gt;
&lt;/td&gt;
&lt;td&gt;❌ &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;Not supported&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Mix with mutex&lt;/td&gt;
&lt;td&gt;✅ Fully supported&lt;/td&gt;
&lt;td&gt;⚠️ Must implement logic&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;⚠️ POSIX &lt;a href="https://docs.pocoproject.org/current/Poco.Event.html" rel="noopener noreferrer"&gt;unverified&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-platform&lt;/td&gt;
&lt;td&gt;✅ Windows &amp;amp; Linux&lt;/td&gt;
&lt;td&gt;✅ STL/Boost&lt;/td&gt;
&lt;td&gt;❌ Windows only&lt;/td&gt;
&lt;td&gt;✅ Windows &amp;amp; Linux&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ease of use&lt;/td&gt;
&lt;td&gt;✅ Simple &amp;amp; flexible&lt;/td&gt;
&lt;td&gt;⚠️ Verbose, error-prone&lt;/td&gt;
&lt;td&gt;✅ Simple&lt;/td&gt;
&lt;td&gt;✅ Simple&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Legend: ✅ = supported, ⚠️ = problematic, ❌ = not available&lt;/p&gt;




&lt;h2&gt;
  
  
  Where SynchEvent Shines
&lt;/h2&gt;

&lt;p&gt;A classic use case for a synchronization event is a &lt;strong&gt;Message Queue&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Queue has a &lt;strong&gt;manual-reset event&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;As long as messages exist → event stays signaled&lt;/li&gt;
&lt;li&gt;When last message is consumed → event resets&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;code&gt;condition_variable&lt;/code&gt;, this requires extra locks, predicates, and loop checks. With &lt;code&gt;SynchEvent&lt;/code&gt;, it’s a &lt;strong&gt;single signal/wait mechanism&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Condition variables are fine for &lt;strong&gt;state predicates&lt;/strong&gt;, but for &lt;strong&gt;pure synchronization&lt;/strong&gt;, &lt;code&gt;SynchEvent&lt;/code&gt; is the sharper tool.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Takeaway
&lt;/h2&gt;

&lt;p&gt;If you’re tired of &lt;strong&gt;condition-variable spaghetti&lt;/strong&gt;, try &lt;strong&gt;SynchEvent&lt;/strong&gt; from &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Areg Framework&lt;/a&gt;: cross-platform, lightweight, and modeled after Windows Events.&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Star the Areg SDK repo on GitHub&lt;/a&gt;&lt;/strong&gt;, try the examples, and experience how effortless C++ multithreading can be!&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>opensource</category>
      <category>programming</category>
      <category>multiplatform</category>
    </item>
    <item>
      <title>🕒 Per-Thread Timers: Areg vs Qt vs POCO</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Wed, 17 Sep 2025 13:26:42 +0000</pubDate>
      <link>https://dev.to/aregtech/per-thread-timers-areg-vs-qt-vs-poco-39g2</link>
      <guid>https://dev.to/aregtech/per-thread-timers-areg-vs-qt-vs-poco-39g2</guid>
      <description>&lt;p&gt;Timers are everywhere — from GUIs to embedded systems — but not all C++ frameworks handle them the same way.&lt;br&gt;&lt;br&gt;
If you’ve ever tried to find a &lt;strong&gt;Windows-like Event/Timer&lt;/strong&gt; (WM_TIMER message) for Linux, you know the struggle: Qt ties timers to the event loop, POCO has limitations, and standard C++ doesn’t offer true per-thread timers out of the box.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;&lt;a href="https://github.com/aregtech/areg-sdk/" rel="noopener noreferrer"&gt;Areg Framework&lt;/a&gt;&lt;/strong&gt; comes in.&lt;br&gt;&lt;br&gt;
Areg delivers &lt;strong&gt;per-thread timers&lt;/strong&gt; that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Accurate (not bound to GUI refresh rates)
&lt;/li&gt;
&lt;li&gt;✅ Thread-aware (fires in the owning thread)
&lt;/li&gt;
&lt;li&gt;✅ Flexible (one-shot, periodic, cyclic)
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔎 Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Areg ⚡&lt;/th&gt;
&lt;th&gt;Qt QTimer 🎨&lt;/th&gt;
&lt;th&gt;POCO Timer ⚙️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thread-Aware&lt;/td&gt;
&lt;td&gt;✅ Target thread&lt;/td&gt;
&lt;td&gt;⚠️ GUI/event loop needed&lt;/td&gt;
&lt;td&gt;⚠️ Callback thread unclear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-Shot/Periodic&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;⚠️ Manual setup required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cyclic/Repeated&lt;/td&gt;
&lt;td&gt;✅ Until stopped&lt;/td&gt;
&lt;td&gt;❌ Outside GUI limited&lt;/td&gt;
&lt;td&gt;❌ Not native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Blocking/Queue&lt;/td&gt;
&lt;td&gt;✅ Event queue&lt;/td&gt;
&lt;td&gt;⚠️ Event loop only&lt;/td&gt;
&lt;td&gt;⚠️ Owner thread unclear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Central Management&lt;/td&gt;
&lt;td&gt;✅ Timer manager&lt;/td&gt;
&lt;td&gt;❌ Independent timers&lt;/td&gt;
&lt;td&gt;⚠️ No central scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;✅ Win/Linux&lt;/td&gt;
&lt;td&gt;⚠️ Desktop/GUI only&lt;/td&gt;
&lt;td&gt;⚠️ Embedded support limited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Full Areg timer example here: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/08_timer/src/main.cpp" rel="noopener noreferrer"&gt;08_timer&lt;/a&gt; → demonstrates 2 threads with 3 timers each.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build &amp;amp; run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/aregtech/areg-sdk.git
&lt;span class="nb"&gt;cd &lt;/span&gt;areg-sdk
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;-j&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the example binary (replace &lt;code&gt;&amp;lt;compiler&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;os&amp;gt;-&amp;lt;hw&amp;gt;-&amp;lt;build-type&amp;gt;-&amp;lt;lib-type&amp;gt;&lt;/code&gt; with the real  path):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./product/build/&amp;lt;compiler&amp;gt;/&amp;lt;os&amp;gt;-&amp;lt;hw&amp;gt;-&amp;lt;build-type&amp;gt;-&amp;lt;lib-type&amp;gt;/bin/08_timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Example: One-Shot, Periodic &amp;amp; Cyclic in Areg
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"areg/base/Timer.hpp"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyTimer&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DispatcherThread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IETimerConsumer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;processTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Timer fired: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;startTimers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mOneShot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// One-shot, fires once&lt;/span&gt;
        &lt;span class="n"&gt;mPeriodic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Periodic, fires 5 times&lt;/span&gt;
        &lt;span class="n"&gt;mCyclic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// Cyclic, runs until stopped&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mOneShot&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"OneShot"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mPeriodic&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Periodic"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mCyclic&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Cyclic"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread, 1)&lt;/code&gt; → one-shot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread, N)&lt;/code&gt; → periodic (N times)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread)&lt;/code&gt; → cyclic (stops with &lt;code&gt;stopTimer()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Simple. Sharp. Reliable.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why care?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;real-time apps&lt;/strong&gt;, &lt;strong&gt;embedded systems&lt;/strong&gt;, or &lt;strong&gt;distributed services&lt;/strong&gt;, GUI-based timers (Qt) or non-thread-guaranteed callbacks (POCO) won’t cut it.&lt;/li&gt;
&lt;li&gt;Areg provides &lt;strong&gt;native, thread-level control&lt;/strong&gt; with minimal code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Note: Windows system timers may have ± a few ms variation. On Linux, Areg timers are more precise.&lt;/p&gt;

&lt;p&gt;👉 Full working example here: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/08_timer/src/main.cpp" rel="noopener noreferrer"&gt;Areg Timer Example&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Takeaway
&lt;/h2&gt;

&lt;p&gt;If you’ve ever wanted &lt;strong&gt;Windows-style timers&lt;/strong&gt; that are &lt;strong&gt;cross-platform, accurate, and thread-safe&lt;/strong&gt;, Areg delivers them out of the box.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>cpp</category>
      <category>opensource</category>
      <category>learning</category>
    </item>
    <item>
      <title>🕒 Per-Thread Timers: Areg vs Qt vs POCO</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Wed, 17 Sep 2025 13:15:09 +0000</pubDate>
      <link>https://dev.to/aregtech/per-thread-timers-areg-vs-qt-vs-poco-38m1</link>
      <guid>https://dev.to/aregtech/per-thread-timers-areg-vs-qt-vs-poco-38m1</guid>
      <description>&lt;p&gt;Timers are everywhere — from GUIs to embedded systems — but not all C++ frameworks handle them the same way.&lt;br&gt;&lt;br&gt;
If you’ve ever tried to find a &lt;strong&gt;Windows-like Event/Timer&lt;/strong&gt; for Linux, you know the struggle: Qt ties timers to the event loop, POCO has limitations, and standard C++ doesn’t offer true per-thread timers out of the box.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;&lt;a href="https://github.com/aregtech/areg-sdk/" rel="noopener noreferrer"&gt;Areg Framework&lt;/a&gt;&lt;/strong&gt; comes in.&lt;br&gt;&lt;br&gt;
Areg delivers &lt;strong&gt;per-thread timers&lt;/strong&gt; that are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Accurate (not bound to GUI refresh rates)
&lt;/li&gt;
&lt;li&gt;✅ Thread-aware (fires in the owning thread)
&lt;/li&gt;
&lt;li&gt;✅ Flexible (one-shot, periodic, cyclic)
&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔎 Quick Comparison
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Areg ⚡&lt;/th&gt;
&lt;th&gt;Qt QTimer 🎨&lt;/th&gt;
&lt;th&gt;POCO Timer ⚙️&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Thread-Aware&lt;/td&gt;
&lt;td&gt;✅ Target thread&lt;/td&gt;
&lt;td&gt;⚠️ GUI/event loop needed&lt;/td&gt;
&lt;td&gt;⚠️ Callback thread unclear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Single-Shot/Periodic&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;✅ Supported&lt;/td&gt;
&lt;td&gt;⚠️ Manual setup required&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cyclic/Repeated&lt;/td&gt;
&lt;td&gt;✅ Until stopped&lt;/td&gt;
&lt;td&gt;❌ Outside GUI limited&lt;/td&gt;
&lt;td&gt;❌ Not native&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Non-Blocking/Queue&lt;/td&gt;
&lt;td&gt;✅ Event queue&lt;/td&gt;
&lt;td&gt;⚠️ Event loop only&lt;/td&gt;
&lt;td&gt;⚠️ Owner thread unclear&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Central Management&lt;/td&gt;
&lt;td&gt;✅ Timer manager&lt;/td&gt;
&lt;td&gt;❌ Independent timers&lt;/td&gt;
&lt;td&gt;⚠️ No central scheduler&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Portability&lt;/td&gt;
&lt;td&gt;✅ Win/Linux&lt;/td&gt;
&lt;td&gt;⚠️ Desktop/GUI only&lt;/td&gt;
&lt;td&gt;⚠️ Embedded support limited&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 Full Areg timer example here: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/08_timer/src/main.cpp" rel="noopener noreferrer"&gt;08_timer&lt;/a&gt; → demonstrates 2 threads with 3 timers each.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Build &amp;amp; run:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/aregtech/areg-sdk.git
&lt;span class="nb"&gt;cd &lt;/span&gt;areg-sdk
cmake &lt;span class="nt"&gt;-B&lt;/span&gt; build
cmake &lt;span class="nt"&gt;--build&lt;/span&gt; build &lt;span class="nt"&gt;-j&lt;/span&gt; 12
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the example binary (replace &lt;code&gt;&amp;lt;compiler&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;os&amp;gt;-&amp;lt;hw&amp;gt;-&amp;lt;build-type&amp;gt;-&amp;lt;lib-type&amp;gt;&lt;/code&gt; with the real  path):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./product/build/&amp;lt;compiler&amp;gt;/&amp;lt;os&amp;gt;-&amp;lt;hw&amp;gt;-&amp;lt;build-type&amp;gt;-&amp;lt;lib-type&amp;gt;/bin/08_timer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ⚡ Example: One-Shot, Periodic &amp;amp; Cyclic in Areg
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;"areg/base/Timer.hpp"&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyTimer&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;public&lt;/span&gt; &lt;span class="n"&gt;DispatcherThread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="n"&gt;IETimerConsumer&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;processTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;override&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cout&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Timer fired: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;timer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getName&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;endl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;startTimers&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;mOneShot&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// One-shot, fires once&lt;/span&gt;
        &lt;span class="n"&gt;mPeriodic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;  &lt;span class="c1"&gt;// Periodic, fires 5 times&lt;/span&gt;
        &lt;span class="n"&gt;mCyclic&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;startTimer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;       &lt;span class="c1"&gt;// Cyclic, runs until stopped&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;private&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mOneShot&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"OneShot"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mPeriodic&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Periodic"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="n"&gt;Timer&lt;/span&gt; &lt;span class="n"&gt;mCyclic&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;"Cyclic"&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread, 1)&lt;/code&gt; → one-shot&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread, N)&lt;/code&gt; → periodic (N times)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;startTimer(timeoutMs, targetThread)&lt;/code&gt; → cyclic (stops with &lt;code&gt;stopTimer()&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Simple. Sharp. Reliable.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why care?
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;For &lt;strong&gt;real-time apps&lt;/strong&gt;, &lt;strong&gt;embedded systems&lt;/strong&gt;, or &lt;strong&gt;distributed services&lt;/strong&gt;, GUI-based timers (Qt) or non-thread-guaranteed callbacks (POCO) won’t cut it.&lt;/li&gt;
&lt;li&gt;Areg provides &lt;strong&gt;native, thread-level control&lt;/strong&gt; with minimal code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Note: Windows system timers may have ± a few ms variation. On Linux, Areg timers are more precise.&lt;/p&gt;

&lt;p&gt;👉 Full working example here: &lt;a href="https://github.com/aregtech/areg-sdk/blob/master/examples/08_timer/src/main.cpp" rel="noopener noreferrer"&gt;Areg Timer Example&lt;/a&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ✅ Takeaway
&lt;/h2&gt;

&lt;p&gt;If you’ve ever wanted &lt;strong&gt;Windows-style timers (WM_TIMER)&lt;/strong&gt; that are &lt;strong&gt;cross-platform, accurate, and thread-safe&lt;/strong&gt;, Areg delivers them out of the box.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>C++ Can Be Easy: Service-Oriented programming with Areg SDK</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Thu, 11 Sep 2025 12:35:52 +0000</pubDate>
      <link>https://dev.to/aregtech/c-can-be-easy-service-oriented-programming-with-areg-sdk-3o5p</link>
      <guid>https://dev.to/aregtech/c-can-be-easy-service-oriented-programming-with-areg-sdk-3o5p</guid>
      <description>&lt;p&gt;C++ has a reputation: fast, powerful… but not exactly “easy.”&lt;br&gt;
Especially when it comes to making components talk to each other.&lt;/p&gt;

&lt;p&gt;Normally, when you program Inter-Process Communication (IPC) or multithreading, you would have to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create threads and message queues&lt;/li&gt;
&lt;li&gt;Open sockets or pipes to send and receive messages&lt;/li&gt;
&lt;li&gt;Write serialization/deserialization&lt;/li&gt;
&lt;li&gt;Dispatch messages and call callbacks manually&lt;/li&gt;
&lt;li&gt;Configure IPC manually&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With &lt;strong&gt;&lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;Areg SDK&lt;/a&gt;&lt;/strong&gt;, you don’t.&lt;/p&gt;

&lt;p&gt;Here’s what calling a service looks like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Consumer calls Provider as if it were local&lt;/span&gt;
&lt;span class="n"&gt;consumer&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;requestData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and the message on remove Service Provider running in other thread or other process is triggered automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="n"&gt;ServiceProvider&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;requestData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="n"&gt;String&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// do business logic here; if needed, response on call&lt;/span&gt;
    &lt;span class="n"&gt;responseData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That’s it. Behind the scenes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Areg spins up the threads&lt;/li&gt;
&lt;li&gt;Routes the request (local or remote)&lt;/li&gt;
&lt;li&gt;Handles synchronization&lt;/li&gt;
&lt;li&gt;Returns the response asynchronously&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You write business logic, not boilerplate. See small &lt;a href="https://github.com/aregtech/areg-sdk/tree/master/examples/01_minimalrpc/src/main.cpp" rel="noopener noreferrer"&gt;C++ working example&lt;/a&gt; of multithreading RPC.&lt;/p&gt;




&lt;h2&gt;
  
  
  Why this matters
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Easy to learn&lt;/strong&gt; → Start with one example, and you’re productive.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to scale&lt;/strong&gt; → Works in the same thread, across processes, or even devices.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Easy to debug&lt;/strong&gt; → No fragile wiring to hunt down.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can write C++, you can build distributed apps — without touching sockets or race conditions.&lt;/p&gt;

&lt;p&gt;👉 Try the &lt;a href="https://github.com/aregtech/areg-sdk/tree/master/examples/01_minimalrpc" rel="noopener noreferrer"&gt;01_minimalrpc&lt;/a&gt; example for multithreading and &lt;a href="https://github.com/aregtech/areg-sdk/tree/master/examples/02_minimalipc" rel="noopener noreferrer"&gt;02_minimalipc&lt;/a&gt;. It’s less code than you think.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Fun project</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Wed, 23 Jul 2025 14:40:37 +0000</pubDate>
      <link>https://dev.to/aregtech/fun-project-1nbo</link>
      <guid>https://dev.to/aregtech/fun-project-1nbo</guid>
      <description>&lt;p&gt;Long time I was not here and I am very sure that none missed me :)&lt;br&gt;
I was busy developing new features of &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;areg skd&lt;/a&gt; and creating &lt;a href="https://github.com/aregtech/areg-sdk-tools" rel="noopener noreferrer"&gt;user interface tool&lt;/a&gt; for &lt;code&gt;areg sdk&lt;/code&gt;. And I must say, that working almost alone for more these 2 project, I made a huge progress. And what is very important, I have fun.&lt;/p&gt;

&lt;p&gt;The current result: &lt;code&gt;areg sdk&lt;/code&gt; now is very functional frameworks with development and testing tools.&lt;/p&gt;

&lt;p&gt;For objective reasons it is not popular yet, because i need to spend more time in media spreading words, but this time will also come. And now, dear reader, you could click the link to go to GitHub repo and give a star for no reason :) You'll lose nothing, and I'll get more motivation.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>productivity</category>
      <category>opensource</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Should be we afraid of competition when go open source?</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Mon, 04 Sep 2023 10:29:50 +0000</pubDate>
      <link>https://dev.to/aregtech/should-be-we-afraid-of-completion-when-go-open-source-2i2j</link>
      <guid>https://dev.to/aregtech/should-be-we-afraid-of-completion-when-go-open-source-2i2j</guid>
      <description>&lt;p&gt;When you are an open source technology provider, you open every corner of the technology you provide, like &lt;a href="https://github.com/aregtech/areg-sdk" rel="noopener noreferrer"&gt;I did&lt;/a&gt;. Surely this helps the competitors to check the solution you provide, what issues you face and probably offer better solution.&lt;/p&gt;

&lt;p&gt;Here comes the question: should be we afraid of competition when go open source? &lt;/p&gt;

&lt;p&gt;Would be interesting to know not only your "yes" and "no", but your answer on "why think so?"&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>programming</category>
      <category>tutorial</category>
      <category>discuss</category>
    </item>
    <item>
      <title>It's a Friday</title>
      <dc:creator>Artak Avetyan</dc:creator>
      <pubDate>Fri, 25 Aug 2023 07:55:51 +0000</pubDate>
      <link>https://dev.to/aregtech/its-a-friday-856</link>
      <guid>https://dev.to/aregtech/its-a-friday-856</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvm9vyl0p3kn8pdq5bdba.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvm9vyl0p3kn8pdq5bdba.png" alt="Goat or bird" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>jokes</category>
    </item>
  </channel>
</rss>
