Site icon Learn C++

What Is Weak 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, weak 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 weak compare and exchange with simple examples.

What is weak compare and exchange in C++?

The Weak 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 for the compare_exchange_weak, first,

[crayon-6763a344079b2761705151/]

and in weak compare and exchange atomic operations, we can use std::compare_exchange_weak template with memory order types.

Here is the syntax for the compare_exchange_weak with memory orders,

[crayon-6763a344079bc708363758/]

here is how we can use it,

[crayon-6763a344079be964154747/]

Note that, providing both compare_exchange_strong and compare_exchange_weak allow us to decide whether we want the library to handle spurious failures (using compare_exchange_strong) or if we want to handle it in our 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 weak compare and exchange in C++?

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

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

[crayon-6763a344079c0604789903/]

Is there a full example of weak compare and exchange in modern C++?

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

[crayon-6763a344079c3239050205/]

The output will be as follows.

[crayon-6763a344079c5959905311/]

As you see weak 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 and weak 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