Multithreading: testing the untestable July 2, 2026 by Marcel Beemster Modern embedded processors rarely perform just one task anymore. We want to process sensor data, communicate with other systems, perform AI inference, and control hardware, all at the same time. Fortunately, today’s processors give us the computing power to do exactly that. The obvious way to take advantage of this hardware is multithreading. The C++ standard library gives us everything we need through facilities such as <thread>, <mutex>, <condition_variable>, and <atomic>. So far, so good. The problem is that multithreading changes the nature of software verification. In a safety-critical environment multithreading introduces significant risk. Enter Non-Determinism Most software behaves predictably. Give it identical input and it produces the same output every time. Multithreaded software doesn’t. It is non-deterministic. The timing of two threads competing for the same resource varies with every program execution. It makes race conditions, deadlocks, and synchronization errors difficult, sometimes nearly impossible, to reproduce. That is why non-determinism is feared more than undefined behavior in testing and validation. Moreover, getting multithreading right is a herculean task at every level of the implementation. Let’s focus on a missing piece in the chain of trust: the library. Focus on the Library When you use the multithreading facilities of the C++ standard library, you need confidence that they behave correctly in every single case. Traditional testing methods, particularly at the application level, are insufficient because a single test run is rarely enough to surface non-deterministic issues. Moreover, the test must look for trouble: when shared resources are simultaneously manipulated by different threads. Tests must actively create contention between threads while remaining portable across different processors, operating systems, and compiler implementations. We must also verify that the intended synchronization actually occurred; otherwise, a passing test proves very little. We recently addressed this challenge in SuperGuard. We have expanded the qualification suite with comprehensive support for the multithreading facilities of the C++ standard library, allowing developers to generate objective qualification evidence for these increasingly important library components. Join the Discussion If you want to develop confidence in your multithreading primitives to ensure quality and/or safety, join our upcoming webinar “SuperGuard: Comprehensive Testing for C++ Multi-Threading Primitives”, presented by Dr. Marcel Beemster, CTO of Solid Sands, and hosted by Circuit Cellar. During the session, Marcel will explain why multithreading is uniquely difficult to verify, how we designed portable qualification tests for the C++ standard library, and how these can be integrated into existing development workflows. The webinar will take place on 8 July 2026 at 17:00 CEST / 16:00 BST / 11:00 EDT / 08:00 PDT, and will conclude with a live Q&A. You can register here: https://streamyard.com/watch/QjWutktGUVvq