<?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: Zeporath</title>
    <description>The latest articles on DEV Community by Zeporath (@zeporath).</description>
    <link>https://dev.to/zeporath</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%2F3096277%2F792eb6ea-9e97-440f-bfa4-ee6d85953d2a.jpeg</url>
      <title>DEV Community: Zeporath</title>
      <link>https://dev.to/zeporath</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/zeporath"/>
    <language>en</language>
    <item>
      <title>Real-Time vs Non-Real-Time Systems: Breaking Down the Key Concepts</title>
      <dc:creator>Zeporath</dc:creator>
      <pubDate>Sun, 27 Apr 2025 13:39:42 +0000</pubDate>
      <link>https://dev.to/zeporath/real-time-vs-non-real-time-systems-concepts-myths-2l4i</link>
      <guid>https://dev.to/zeporath/real-time-vs-non-real-time-systems-concepts-myths-2l4i</guid>
      <description>&lt;p&gt;As software developers, we often encounter the term "real-time." But what does it truly mean from a software perspective, particularly when working with C++ in a Linux environment? What one domain considers "real-time" might not be fast enough for another.&lt;/p&gt;

&lt;p&gt;We can categorize the real-time behavior of software into a few key areas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Hard Real-Time (e.g., Airbag Deployment Systems):&lt;/strong&gt; In these systems, missing a deadline is catastrophic. Failure to meet timing constraints can lead to severe consequences.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Soft Real-Time (e.g., Sensor Data Readings for Speed):&lt;/strong&gt; Here, missing a deadline is tolerable, although it may degrade performance or user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Non-Real-Time (e.g., Video Streaming Over a Dashboard):&lt;/strong&gt; The primary focus is on minimizing latency and maximizing throughput, rather than strict adherence to deadlines.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ultimately, the classification of a system as hard, soft, or non-real-time depends on its criticality and the design choices made during development. We'll delve into those design choices in future blog posts. For now, let's recap and solidify our understanding of the fundamental concepts surrounding the "what" and "how" of real-time tasks, especially as they relate to C++ development on Linux platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is &lt;strong&gt;REAL TIME&lt;/strong&gt;:
&lt;/h2&gt;

&lt;p&gt;Real-time does not mean fast. It means predictable and guaranteed response times. &lt;br&gt;
They are everywhere, from embedded devices (robot arms) to specialized servers (stock trading engines).&lt;br&gt;
So if we can characterize the real-time and non-real time tasks as:&lt;/p&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;Real-time Threads&lt;/th&gt;
&lt;th&gt;Non-real-time Threads&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scheduling&lt;/td&gt;
&lt;td&gt;Priority-based, often fixed-priority (e.g., FIFO, RR)&lt;/td&gt;
&lt;td&gt;Fairness-based (e.g., CFS in Linux)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Timing Guarantees&lt;/td&gt;
&lt;td&gt;Must meet deadlines&lt;/td&gt;
&lt;td&gt;Best-effort, no timing guarantee&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Preemption&lt;/td&gt;
&lt;td&gt;High priority to preempt lower&lt;/td&gt;
&lt;td&gt;May not preempt immediately&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Examples&lt;/td&gt;
&lt;td&gt;Motor control, medical devices&lt;/td&gt;
&lt;td&gt;Web servers, user applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  Who enables/gives REAL TIME:
&lt;/h2&gt;

&lt;p&gt;It's your code where you specify for a thread to be a real-time or not. And the OS while executing will honor your demands, provided its capable of doing so.&lt;/p&gt;

&lt;p&gt;Roles of CPU Execution vs Kernel Scheduling in real-time executions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;CPU simply executes instructions.&lt;/li&gt;
&lt;li&gt;It’s the OS (kernel scheduler) that determines who runs when.&lt;/li&gt;
&lt;li&gt;Real-time OS or Linux with real-time extensions ensures deadlines by:

&lt;ul&gt;
&lt;li&gt;Priority-based preemptive scheduling (&lt;code&gt;SCHED_FIFO&lt;/code&gt;, &lt;code&gt;SCHED_RR&lt;/code&gt;, &lt;code&gt;SCHED_DEADLINE&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;Avoiding blocking I/O.&lt;/li&gt;
&lt;li&gt;Locking memory into RAM (&lt;code&gt;mlockall&lt;/code&gt;) etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  🔥 Can a process on Linux have both real-time and non-real-time threads?
&lt;/h2&gt;

&lt;p&gt;✅ YES.&lt;br&gt;
In Linux, each thread has its own scheduling policy (&lt;code&gt;SCHED_OTHER&lt;/code&gt;, &lt;code&gt;SCHED_FIFO&lt;/code&gt;, &lt;code&gt;SCHED_RR&lt;/code&gt;, etc.).&lt;br&gt;
So, one process can absolutely have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Some threads running real-time (e.g., &lt;code&gt;SCHED_FIFO&lt;/code&gt; policy).&lt;/li&gt;
&lt;li&gt;Some threads running normal (e.g., &lt;code&gt;SCHED_OTHER&lt;/code&gt; policy).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 In fact, it's common to design this way:&lt;br&gt;
  &lt;strong&gt;Real-time thread&lt;/strong&gt;: handles sensor readings, motor control, etc.&lt;br&gt;
  &lt;strong&gt;Non-real-time thread&lt;/strong&gt;: logs data to disk, handles user input, sends reports over network&lt;/p&gt;

&lt;p&gt;Enough with concepts, let's look at a demo code:&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;iostream&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;thread&amp;gt;&lt;/span&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;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;queue&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;chrono&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cmath&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;mutex&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;condition_variable&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;complex&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;cstring&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;pthread.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;sched.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;unistd.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="k"&gt;namespace&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;chrono_literals&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// Shared data queue&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;queue&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;dataQueue&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;mutex&lt;/span&gt; &lt;span class="n"&gt;queueMutex&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;dataCond&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;finished&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;constexpr&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;DATA_SIZE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;constexpr&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;DEADLINE_US&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;220&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Real-time deadline&lt;/span&gt;

&lt;span class="c1"&gt;// Dummy FFT function (simulate work)&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;dummyFFT&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;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="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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;complex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;size_t&lt;/span&gt; &lt;span class="n"&gt;i&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="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;output&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;complex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&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;sin&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="n"&gt;i&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;cos&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="n"&gt;i&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="c1"&gt;// Set CPU affinity &lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set_cpu_affinity&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;cpu_id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cpu_set_t&lt;/span&gt; &lt;span class="n"&gt;cpuset&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;CPU_ZERO&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;cpuset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;CPU_SET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_id&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;cpuset&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Set CPU ID (for example, CPU 0)&lt;/span&gt;

    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pthread_setaffinity_np&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pthread_self&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;sizeof&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cpu_set_t&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;cpuset&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;s&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"Error setting CPU affinity: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;strerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&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="k"&gt;else&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;"[Info] Thread bound to CPU "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;cpu_id&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Set thread to real-time scheduling policy&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;set_realtime_priority&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="nc"&gt;sched_param&lt;/span&gt; &lt;span class="n"&gt;sched&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;sched&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sched_priority&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Priority from 1-99 (higher = more important)&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;pthread_setschedparam&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pthread_self&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;SCHED_FIFO&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;sched&lt;/span&gt;&lt;span class="p"&gt;)&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;cerr&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;"[Warning] Failed to set real-time priority: "&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;strerror&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errno&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="s"&gt;"&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="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&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;"[Info] Real-time priority set.&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Real-time consumer thread&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;realTimeThread&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;set_realtime_priority&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="n"&gt;set_cpu_affinity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;      &lt;span class="c1"&gt;// Set CPU affinity to core 0 &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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;complex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fftOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Preallocated buffer&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="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;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queueMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataCond&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;lock&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dataQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;;&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;finished&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;dataQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&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;data&lt;/span&gt; &lt;span class="o"&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;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataQueue&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;dataQueue&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="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;steady_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

        &lt;span class="n"&gt;dummyFFT&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="n"&gt;fftOutput&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;end&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;steady_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&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;duration&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration_cast&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&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;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;count&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;"[RealTimeThread] Processing Time: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" us"&lt;/span&gt;
                  &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;DEADLINE_US&lt;/span&gt; &lt;span class="o"&gt;?&lt;/span&gt; &lt;span class="s"&gt;" -- Deadline Missed!"&lt;/span&gt; &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;" -- OK"&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="s"&gt;"&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Non-real-time consumer thread&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;nonRealTimeThread&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&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="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;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queueMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataCond&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;lock&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;dataQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="n"&gt;finished&lt;/span&gt;&lt;span class="p"&gt;;&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;finished&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;dataQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;empty&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;data&lt;/span&gt; &lt;span class="o"&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;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dataQueue&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;dataQueue&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="k"&gt;auto&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;steady_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&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="n"&gt;std&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;complex&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;fftOutput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Dynamic allocation each time&lt;/span&gt;
        &lt;span class="n"&gt;dummyFFT&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="n"&gt;fftOutput&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;end&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;steady_clock&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;now&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;duration&lt;/span&gt; &lt;span class="o"&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;duration_cast&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;chrono&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;microseconds&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;end&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="n"&gt;count&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;"[NonRealTimeThread] Processed a frame. Processing Time: "&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;duration&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s"&gt;" us&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="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Data producer thread&lt;/span&gt;
&lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;producerThread&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;frames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&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;frame&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="n"&gt;frame&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;frame&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;vector&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;double&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;DATA_SIZE&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="k"&gt;for&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;i&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="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;DATA_SIZE&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="n"&gt;i&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="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&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;sin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;M_PI&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="n"&gt;DATA_SIZE&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;lock_guard&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;queueMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
            &lt;span class="n"&gt;dataQueue&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;push&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;move&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="p"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;dataCond&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify_all&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;this_thread&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;sleep_for&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mx"&gt;10us&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Simulate streaming every 10us&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Signal consumers to exit&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;lock&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;queueMutex&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;finished&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;dataCond&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;notify_all&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;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;producer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;producerThread&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// produce 100 frames&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;rtThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;realTimeThread&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;nrtThread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nonRealTimeThread&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="n"&gt;producer&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="n"&gt;rtThread&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="n"&gt;nrtThread&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="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;"All done!&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="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;We need to carefully plan our deadline, which in my case I kept &lt;code&gt;200us&lt;/code&gt;. &lt;br&gt;
Planning your real-time task's attributes is completely an investigation based design choice, the right and wrongs are in your hand, OS only promises time-bound response.&lt;br&gt;
In the code, we are setting two main real-time "attributes" for the thread:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Real-time scheduling policy:&lt;br&gt;
We set the thread to &lt;code&gt;SCHED_FIFO&lt;/code&gt; with a priority of &lt;code&gt;80&lt;/code&gt; inside &lt;code&gt;set_realtime_priority()&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;CPU affinity:&lt;br&gt;
We pin the real-time thread to CPU 0 using &lt;code&gt;set_cpu_affinity(0)&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;What We Did Right&lt;/th&gt;
&lt;th&gt;What Problems Still Exist (Causing Deadline Miss)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Set SCHED_FIFO (real-time) scheduling.&lt;/td&gt;
&lt;td&gt;- Linux is not a "hard" real-time OS (it's soft real-time at best without PREEMPT-RT patch).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Set a high priority (80/99).&lt;/td&gt;
&lt;td&gt;- Interrupts (IRQ) are still served by the same CPU and can preempt your real-time thread.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Pinned to a single CPU core (CPU 0).&lt;/td&gt;
&lt;td&gt;- Higher priority threads/processes (e.g., kernel daemons, IRQ handlers) can preempt your thread.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- Cache misses and memory contention can cause random latency spikes.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- Power-saving features (like CPU frequency scaling) can add jitter.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;- Lock contention (if other threads are using mutexes, condition variables) can delay wakeup.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;So if we pay attention to output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sshekhar@sshekhar:~/workspace/practice&lt;span class="nv"&gt;$ &lt;/span&gt;g++ nrt_rt_demo.cpp &lt;span class="nt"&gt;-lpthread&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; realtime_demo
sshekhar@sshekhar:~/workspace/practice&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./realtime_demo 
&lt;span class="o"&gt;[&lt;/span&gt;Info] Real-time priority set.
&lt;span class="o"&gt;[&lt;/span&gt;Info] Thread bound to CPU 0
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 264 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 421 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 258 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 215 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 489 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 229 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 250 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 246 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 290 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 220 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 226 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 336 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 202 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 200 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 216 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 205 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 200 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 203 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 203 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 330 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 205 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 207 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 226 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 205 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 202 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 204 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 216 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 205 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 200 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 206 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 226 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 183 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 204 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 200 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 278 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 225 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 203 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 223 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 224 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 216 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 210 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 351 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 224 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 200 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 221 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 313 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 225 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 271 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 246 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 206 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 201 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 202 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 296 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 218 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 228 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 259 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 232 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 229 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 242 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 252 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 266 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 300 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 216 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 311 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 234 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 212 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 206 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 208 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 231 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 213 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 210 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 206 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 224 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 250 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 241 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 232 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 207 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 256 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 246 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 231 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 320 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 215 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 211 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 237 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 241 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 222 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 252 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 249 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 327 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 236 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 224 us &lt;span class="nt"&gt;--&lt;/span&gt; Deadline Missed!
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 219 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 211 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
All &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
sshekhar@sshekhar:~/workspace/practice&lt;span class="err"&gt;$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  ⌚ Rooms for improvement
&lt;/h3&gt;

&lt;p&gt;✅ Setting SCHED_FIFO means your thread can preempt normal (non-real-time) threads immediately.&lt;/p&gt;

&lt;p&gt;✅ Pinning to CPU 0 reduces migration cost (cache misses) and context-switch overheads — but CPU 0 is often very busy (it often handles kernel housekeeping tasks and interrupts). Maybe pinning to CPU 1, 2, 3 would be slightly better.&lt;/p&gt;

&lt;p&gt;And by just a small change in cpu pinning to CPU 3:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sshekhar@sshekhar:~/workspace/practice&lt;span class="nv"&gt;$ &lt;/span&gt;g++ nrt_rt_demo.cpp &lt;span class="nt"&gt;-lpthread&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; realtime_demo
sshekhar@sshekhar:~/workspace/practice&lt;span class="nv"&gt;$ &lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt; ./realtime_demo 
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;sudo&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; password &lt;span class="k"&gt;for &lt;/span&gt;sshekhar: 
&lt;span class="o"&gt;[&lt;/span&gt;Info] Real-time priority set.
&lt;span class="o"&gt;[&lt;/span&gt;Info] Thread bound to CPU 3
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 141 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 51 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 50 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 50 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 50 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 47 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 96 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 93 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 95 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 87 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 89 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 65 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 91 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 91 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 97 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 95 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 87 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 97 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 96 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 101 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 89 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 91 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 121 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 96 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 87 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 91 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 105 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 121 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 92 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 120 us
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 111 us
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 117 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 124 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 81 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 119 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 84 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 81 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 80 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 81 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 78 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 133 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 79 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 88 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 78 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 92 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 97 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 82 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 90 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 92 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;NonRealTimeThread] Processed a frame. Processing Time: 122 us
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 83 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 84 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 95 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 95 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 99 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
&lt;span class="o"&gt;[&lt;/span&gt;RealTimeThread] Processing Time: 87 us &lt;span class="nt"&gt;--&lt;/span&gt; OK
All &lt;span class="k"&gt;done&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are now 0 deadline misses and execution time is less than half of threshold.&lt;/p&gt;

&lt;p&gt;And believe me we can refine it further! But its too lengthy for this blog.&lt;/p&gt;

&lt;p&gt;To Summarize:&lt;/p&gt;

&lt;h2&gt;
  
  
  🧠 What in real-time execution actually happens:
&lt;/h2&gt;

&lt;h3&gt;
  
  
  ✅ The CPU:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Is always dumb — it just fetches and executes instructions, cycle-by-cycle.&lt;/li&gt;
&lt;li&gt;It doesn’t "know" about real-time or non-real-time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ The Kernel (OS Scheduler):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Controls which thread gets to run next on the CPU.&lt;/li&gt;
&lt;li&gt;When you ask for real-time (&lt;code&gt;SCHED_FIFO&lt;/code&gt;, &lt;code&gt;SCHED_RR&lt;/code&gt;, etc.), you're telling the kernel:

&lt;ul&gt;
&lt;li&gt;"Hey, always prioritize this thread over others!"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ The Real-Time Priority:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;High priority real-time threads preempt low-priority threads immediately.&lt;/li&gt;
&lt;li&gt;Even inside the kernel itself (with &lt;code&gt;PREEMPT_RT&lt;/code&gt; patches).&lt;/li&gt;
&lt;li&gt;So if you're running at &lt;code&gt;SCHED_FIFO&lt;/code&gt; priority 90, and a logger at 10, the logger won't disturb you.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Memory locking (&lt;code&gt;mlockall&lt;/code&gt;):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Prevents page faults.

&lt;ul&gt;
&lt;li&gt;In normal Linux, if your code touches new memory, the kernel might say, "Wait, let me fetch this page from disk..."&lt;/li&gt;
&lt;li&gt;That "disk fetch" = hundreds of microseconds → instant death for real-time.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;mlockall(MCL_CURRENT | MCL_FUTURE);&lt;/code&gt; keeps all your current and future allocations in RAM.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;✅ Lockless programming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In RT, you want to never block on locks, semaphores, etc.&lt;/li&gt;
&lt;li&gt;Use lock-free data structures, atomics, or message queues designed for RT.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In following blogs, me try to contribute about what kind of design choices should we make while developing an application related to real-time demands.&lt;/p&gt;

</description>
      <category>cpp</category>
      <category>linux</category>
      <category>programming</category>
      <category>architecture</category>
    </item>
  </channel>
</rss>
