Site icon Learn C++

Learn Strong Compare and Exchange In Modern C++

Learn Strong Compare and Exchange In Modern C++

Since the C++11 standard, the Concurrency Support Library includes built-in support for threads (std::thread) with atomic operations (std::atomic). C++11 provides both weak and strong compare-and-exchange operations in multi-threading applications. Since C++11, strong compare and exchange are used in modern C++ standards such as C++14, C++17, C++20, and in other new standards. In this post, we explain what is strong compare and exchange is with simple examples.

What is strong compare and exchange in C++?

The Strong Compare and Exchange template atomically compares the value pointed to by the atomic object with the value pointed to by expected. This feature comes with C++11 and is used in other modern C++ standards, and performs the following operations based on the comparison results:

There are two most common syntaxes, here is the syntax for the compare_exchange_strong, first,

[crayon-6763a90b49365958361086/]

and in strong compare and exchange atomic operations, we can use std::compare_exchange_strong template with memory order types. Here is the syntax for the compare_exchange_strong with memory orders,

[crayon-6763a90b4936f282197979/]

here is how we can use it,

[crayon-6763a90b49371469056836/]

Note that providing both compare_exchange_strong and compare_exchange_weak allows us to decide whether we want the library to handle spurious failures (using compare_exchange_strong) or if we want to handle it in ourr own code (using compare_exchange_weak). The compare_exchange_strong needs extra overhead to retry in the case of failure. For details, please see Load-link/store-conditional in Wikipedia.

Is there a simple example of strong compare and exchange in C++?

Here is a simple example about strong compare and exchange in modern C++.

Let’s assume we have a thread function myf1() that ensures value is changed after a strong compare and exchange. This is how we can do this,

[crayon-6763a90b49374232202427/]

Is there a full example about strong compare and exchange in C++?

Let’s assume we have a thread function myf1() that ensures value is changed after a strong compare and exchange. Let’s do the change after 1 second with myf2(). Here is the full example of strong compare and exchange in modern C++,

[crayon-6763a90b4937a950279267/]

The output will be as follows.

[crayon-6763a90b4937d988668338/]

As you see strong compare-and-exchange operation is an atomic operation that can be used in multi-threaded applications to achieve synchronization. For more information about this strong compare and exchange feature, see Strong Compare and Exchange Proposal document.

C++ Builder is the easiest and fastest C and C++ IDE for building simple or professional applications on the Windows, MacOS, iOS & Android operating systems. It is also easy for beginners to learn with its wide range of samples, tutorials, help files, and LSP support for code. RAD Studio’s C++ Builder version comes with the award-winning VCL framework for high-performance native Windows apps and the powerful FireMonkey (FMX) framework for cross-platform UIs.

There is a free C++ Builder Community Edition for students, beginners, and startups; it can be downloaded from here. For professional developers, there are Professional, Architect, or Enterprise version.

Exit mobile version