


Why Utilize memory_order_seq_cst for Stop Flag Setting, While Checking with memory_order_relaxed?
In his discussion on atomic operations, Herb Sutter presents an example usage of atomics, including a stop flag mechanism:
- A main thread initiates several worker threads.
-
Worker threads continuously check the stop flag:
while (!stop.load(std::memory_order_relaxed)) { // Do stuff. }
- The main thread eventually sets stop = true with order=seq_cst, and then joins the workers.
Reasons for Not Using relaxed on Store Operation
Although Herb suggests that using memory_order_relaxed for checking the flag is acceptable due to minimal latency concerns, there is no noticeable performance advantage to employing stricter memory orders, even if latency were a priority.
The reasoning behind not using relaxed on the store operation remains unclear, possibly due to an oversight or a personal preference.
Latency Considerations
ISO C standards do not enforce specific timeframes for store visibility or provide guidance on how to influence it. These provisions apply to all atomic operations, including relaxed. However, implementations are encouraged to make store values accessible to atomic loads within a reasonable timeframe.
In practice, specific latency is determined by the implementation, with hardware cache coherence mechanisms typically allowing visibility within tens of nanoseconds in best-case scenarios and sub-microsecond intervals in near-worst-case scenarios.
Memory Order Implications
Different memory orders for store or load operations do not expedite stores in real time, they merely control whether subsequent operations can become globally visible while the store is still pending.
In essence, stronger orders and barriers do not accelerate events absolutely, but rather postpone others until the store or load is complete. This holds true for all real-world CPUs, which strive to make stores visible to other cores instantaneously.
Hence, increasing memory orders, such as using seq_cst, ensures that changes to the stop flag are immediately visible to worker threads, guaranteeing a swift shutdown. However, it does not impact the actual visibility latency.
Benefits of relaxed Check
Using memory_order_relaxed for the check operation has several advantages:
- Minimized instruction-level and memory-level parallelism bottlenecks.
- Reduced overhead on instruction-level parallelism-limited architectures, especially those with high-cost barriers.
- Eliminated wasted work due to branch mispredictions on load results.
Additional Considerations
Herb correctly identifies that using relaxed for the dirty flag is also acceptable due to the synchronization provided by thread.join. However, it should be noted that dirty requires atomicity to prevent simultaneous writes of the same value, which is still considered a data race under ISO C standards.
In conclusion, while using memory_order_seq_cst for setting the stop flag ensures immediate visibility to worker threads, there is no performance benefit to doing so over relaxed for the load operation. memory_order_relaxed offers advantages in terms of instruction-level parallelism and memory bandwidth utilization, making it the preferred choice in such scenarios.
The above is the detailed content of Why use `memory_order_seq_cst` for setting the stop flag but `memory_order_relaxed` for checking it?. For more information, please follow other related articles on the PHP Chinese website!

Converting from XML to C and performing data operations can be achieved through the following steps: 1) parsing XML files using tinyxml2 library, 2) mapping data into C's data structure, 3) using C standard library such as std::vector for data operations. Through these steps, data converted from XML can be processed and manipulated efficiently.

C# uses automatic garbage collection mechanism, while C uses manual memory management. 1. C#'s garbage collector automatically manages memory to reduce the risk of memory leakage, but may lead to performance degradation. 2.C provides flexible memory control, suitable for applications that require fine management, but should be handled with caution to avoid memory leakage.

C still has important relevance in modern programming. 1) High performance and direct hardware operation capabilities make it the first choice in the fields of game development, embedded systems and high-performance computing. 2) Rich programming paradigms and modern features such as smart pointers and template programming enhance its flexibility and efficiency. Although the learning curve is steep, its powerful capabilities make it still important in today's programming ecosystem.

C Learners and developers can get resources and support from StackOverflow, Reddit's r/cpp community, Coursera and edX courses, open source projects on GitHub, professional consulting services, and CppCon. 1. StackOverflow provides answers to technical questions; 2. Reddit's r/cpp community shares the latest news; 3. Coursera and edX provide formal C courses; 4. Open source projects on GitHub such as LLVM and Boost improve skills; 5. Professional consulting services such as JetBrains and Perforce provide technical support; 6. CppCon and other conferences help careers

C# is suitable for projects that require high development efficiency and cross-platform support, while C is suitable for applications that require high performance and underlying control. 1) C# simplifies development, provides garbage collection and rich class libraries, suitable for enterprise-level applications. 2)C allows direct memory operation, suitable for game development and high-performance computing.

C Reasons for continuous use include its high performance, wide application and evolving characteristics. 1) High-efficiency performance: C performs excellently in system programming and high-performance computing by directly manipulating memory and hardware. 2) Widely used: shine in the fields of game development, embedded systems, etc. 3) Continuous evolution: Since its release in 1983, C has continued to add new features to maintain its competitiveness.

The future development trends of C and XML are: 1) C will introduce new features such as modules, concepts and coroutines through the C 20 and C 23 standards to improve programming efficiency and security; 2) XML will continue to occupy an important position in data exchange and configuration files, but will face the challenges of JSON and YAML, and will develop in a more concise and easy-to-parse direction, such as the improvements of XMLSchema1.1 and XPath3.1.

The modern C design model uses new features of C 11 and beyond to help build more flexible and efficient software. 1) Use lambda expressions and std::function to simplify observer pattern. 2) Optimize performance through mobile semantics and perfect forwarding. 3) Intelligent pointers ensure type safety and resource management.


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Atom editor mac version download
The most popular open source editor

MinGW - Minimalist GNU for Windows
This project is in the process of being migrated to osdn.net/projects/mingw, you can continue to follow us there. MinGW: A native Windows port of the GNU Compiler Collection (GCC), freely distributable import libraries and header files for building native Windows applications; includes extensions to the MSVC runtime to support C99 functionality. All MinGW software can run on 64-bit Windows platforms.

EditPlus Chinese cracked version
Small size, syntax highlighting, does not support code prompt function

Dreamweaver Mac version
Visual web development tools

Notepad++7.3.1
Easy-to-use and free code editor