Espacios de nombres
Variantes
Acciones

std::atomic_fetch_or, std::atomic_fetch_or_explicit

De cppreference.com
< cpp‎ | atomic
 
 
 
Definido en el archivo de encabezado <atomic>
(1)(desde C++11)
template<class T >

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

                   typenamestd::atomic<T>::value_type arg )noexcept;
template<class T >

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

                   typenamestd::atomic<T>::value_type arg )noexcept;
(2)(desde C++11)
template<class T >

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

                            std::memory_order order)noexcept;
template<class T >

T atomic_fetch_or_explicit(volatilestd::atomic<T>* obj,
                            typenamestd::atomic<T>::value_type arg,

                            std::memory_order order)noexcept;

Reemplaza atómicamente el valor al que apunta obj con el resultado de una operación OR bit a bit entre el valor antiguo de obj y arg. Devuelve el valor que obj tenía anteriormente.

La operación se realiza como si se hubiera ejecutado lo siguiente:

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

Si std::atomic<T> no tiene un miembro fetch_or (este miembro solo se proporciona para tipos enteros), el programa está mal formado.

Contenido

[editar]Parámetros

obj - Un puntero al objeto atómico a modificar. bool no es un tipo entero a los efectos de las operaciones atómicas.
arg - El valor al cual aplicar la operación OR bit a bit y al valor almacenado en el objeto atómico.
order - El ordenamiento de sincronización de memoria para esta operación. Se permiten todos los valores.

[editar]Valor de retorno

El valor inmediatamente anterior a los efectos de esta función en el orden de modificación de *obj.

[editar]Posible implementación

template<class T > T atomic_fetch_or(std::atomic<T>* obj, typenamestd::atomic<T>::value_type arg ){return obj->fetch_or(arg);}

[editar]Ejemplo

#include <iostream>#include <atomic>#include <thread>#include <chrono>#include <functional>   // Semáforo binario solo a efectos de demostración // Es un ejemplo sencillo pero significativo: las operaciones atómicas// son innecesarias sin hilos. class Semaphore {std::atomic_char m_signaled;public: Semaphore(bool initial =false){ m_signaled = initial;}// Se bloquea hasta que el semáforo se señalevoid 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 {staticconstint N =100;staticconstint 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();// señal de impresión a ocurrir m_count_sem.take();// esperar hasta que la impresión complete}}std::cout<<"count_up() lista\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() lista\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();}

Salida:

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

[editar]Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
P0558R1 C++11 Se requiere una coincidencia de tipo exacta porque T
se deduce de varios argumentos.
T se deduce únicamente del argumento atomic.

[editar]Véase también

(C++11)
atomically performs bitwise OR between the argument and the value of the atomic object and obtains the value held previously
(función miembro pública de std::atomic)[editar]
Reemplaza el objeto atómico con el resultado de la operación lógica AND con un argumento no atómico y obtiene el valor anterior del objeto atómico.
(plantilla de función)[editar]
Reemplaza el objeto atómico con el resultado de la operación lógica XOR con un argumento no atómico y obtiene el valor anterior del objeto atómico.
(plantilla de función)[editar]
Documentación de C para atomic_fetch_or, atomic_fetch_or_explicit
close