Namespaces
Variants

std:: atomic_fetch_or, std:: atomic_fetch_or_explicit

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
atomic_fetch_or atomic_fetch_or_explicit
(C++11) (C++11)
Free functions for atomic flags
Défini dans l'en-tête <atomic>
template < class T >

T atomic_fetch_or ( std:: atomic < T > * obj,

typename std:: atomic < T > :: value_type arg ) noexcept ;
(1) (depuis C++11)
template < class T >

T atomic_fetch_or ( volatile std:: atomic < T > * obj,

typename std:: atomic < T > :: value_type arg ) noexcept ;
(2) (depuis C++11)
template < class T >

T atomic_fetch_or_explicit ( std:: atomic < T > * obj,
typename std:: atomic < T > :: value_type arg,

std:: memory_order order ) noexcept ;
(3) (depuis C++11)
template < class T >

T atomic_fetch_or_explicit ( volatile std:: atomic < T > * obj,
typename std:: atomic < T > :: value_type arg,

std:: memory_order order ) noexcept ;
(4) (depuis C++11)

Remplace atomiquement la valeur pointée par obj par le résultat de l'opération OR bit à bit entre l'ancienne valeur de obj et arg . Renvoie la valeur obj détenue précédemment.

L'opération est effectuée comme si l'instruction suivante était exécutée :

1,2) obj - > fetch_or ( arg )
3,4) obj - > fetch_or ( arg, order )

Si std::atomic<T> ne possède pas de membre fetch_or (ce membre est uniquement fourni pour les types intégraux excepté bool ), le programme est mal formé.

Table des matières

Paramètres

obj - pointeur vers l'objet atomique à modifier
arg - valeur à appliquer par OU binaire à la valeur stockée dans l'objet atomique
order - ordonnancement de synchronisation de la mémoire

Valeur de retour

La valeur précédant immédiatement les effets de cette fonction dans l' ordre de modification de * obj .

Exemple

#include <atomic>
#include <chrono>
#include <functional>
#include <iostream>
#include <thread>
// Sémaphore binaire à des fins de démonstration uniquement.
// Ceci est un exemple simple mais significatif : les opérations atomiques
// sont inutiles sans threads.
class Semaphore
{
    std::atomic_char m_signaled;
public:
    Semaphore(bool initial = false)
    {
        m_signaled = initial;
    }
    // Bloquer jusqu'à ce que le sémaphore soit signalé
    void take() 
    {
        while (!std::atomic_fetch_and(&m_signaled, false))
        {
            std::this_thread::sleep_for(std::chrono::milliseconds(10));
        }
    }
    void put() 
    {
        std::atomic_fetch_or(&m_signaled, true);
    }
};
class ThreadedCounter
{
    static const int N = 100;
    static const int REPORT_INTERVAL = 10;
    int m_count;
    bool m_done;
    Semaphore m_count_sem;
    Semaphore m_print_sem;
    void count_up() 
    {
        for (m_count = 1; m_count <= N; ++m_count)
            if (m_count % REPORT_INTERVAL == 0)
            {
                if (m_count == N)
                    m_done = true;
                m_print_sem.put(); // signaler que l'impression doit se produire
                m_count_sem.take(); // attendre que l'impression soit terminée avant de continuer
            }
        std::cout << "count_up() done\n";
        m_done = true;
        m_print_sem.put();
    }
    void print_count() 
    {
        do
        {
            m_print_sem.take();
            std::cout << m_count << '\n';
            m_count_sem.put();
        }
        while (!m_done);
        std::cout << "print_count() done\n";
    }
public:
    ThreadedCounter() : m_done(false) {}
    void run() 
    {
        auto print_thread = std::thread(&ThreadedCounter::print_count, this);
        auto count_thread = std::thread(&ThreadedCounter::count_up, this);
        print_thread.join();
        count_thread.join();
    }
};
int main() 
{
    ThreadedCounter m_counter;
    m_counter.run();
}

Sortie :

10
20
30
40
50
60
70
80
90
100
print_count() done
count_up() done

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Appliqué à Comportement publié Comportement correct
P0558R1 C++11 une correspondance exacte de type était requise car
T était déduit de multiples arguments
T est uniquement déduit
de obj

Voir aussi

effectue atomiquement un OU binaire entre l'argument et la valeur de l'objet atomique et obtient la valeur détenue précédemment
(fonction membre publique de std::atomic<T> )
remplace l'objet atomique par le résultat du ET binaire avec un argument non atomique et obtient la valeur précédente de l'atome
(fonction template)
remplace l'objet atomique par le résultat du OU exclusif binaire avec un argument non atomique et obtient la valeur précédente de l'atome
(fonction template)
Documentation C pour atomic_fetch_or , atomic_fetch_or_explicit