std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
Материал из cppreference.com
|
|
This page has been machine-translated from the English version of the wiki using Google Translate.
The translation may contain errors and awkward wording. Hover over text to see the original version. You can help to fix errors and improve the translation. For instructions click here. |
| Заголовочный файл <atomic>
|
||
| bool atomic_flag_test_and_set( volatile std::atomic_flag* p ); |
(1) | (начиная с C++11) |
| bool atomic_flag_test_and_set( std::atomic_flag* p ); |
(2) | (начиная с C++11) |
| bool atomic_flag_test_and_set_explicit( volatile std::atomic_flag* p, std::memory_order order ); |
(3) | (начиная с C++11) |
| bool atomic_flag_test_and_set_explicit( std::atomic_flag* p, std::memory_order order ); |
(4) | (начиная с C++11) |
Атомарно изменяет состояние std::atomic_flag, на которую указывает
p для установки (true) и возвращает значение, оно состоится до. Original:
Atomically changes the state of a std::atomic_flag pointed to by
p to set (true) and returns the value it held before. The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
Содержание |
[править] Параметры
| p | - | Указатель на std::atomic_flag доступа
Original: pointer to std::atomic_flag to access The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
| order | - | Чтобы синхронизации памяти для этой операции
Original: the memory synchronization order for this operation The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. |
[править] Возвращаемое значение
Значение ранее занимал флаг указывает
pOriginal:
The value previously held by the flag pointed to by
pThe text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
[править] Исключения
[править] Возможная реализация
| Первый вариант |
|---|
bool atomic_flag_test_and_set(volatile std::atomic_flag* p) { return p->test_and_set(); } |
| Второй вариант |
bool atomic_flag_test_and_set(std::atomic_flag* p) { return p->test_and_set(); } |
| Третий вариант |
bool atomic_flag_test_and_set_explicit(volatile std::atomic_flag* p, std::memory_order order) { return p->test_and_set(order); } |
| Четвёртый вариант |
bool atomic_flag_test_and_set_explicit(std::atomic_flag* p, std::memory_order order) { return p->test_and_set(order); } |
[править] Пример
Блокировкой мьютекса может быть реализован в пользовательском пространстве использованием atomic_flag
Original:
A spinlock mutex can be implemented in userspace using an atomic_flag
The text has been machine-translated via Google Translate.
You can help to correct and verify the translation. Click here for instructions.
You can help to correct and verify the translation. Click here for instructions.
#include <thread> #include <vector> #include <iostream> #include <atomic> std::atomic_flag lock = ATOMIC_FLAG_INIT; void f(int n) { for(int cnt = 0; cnt < 100; ++cnt) { while(std::atomic_flag_test_and_set_explicit(&lock, std::memory_order_acquire)) ; // spin until the lock is acquired std::cout << "Output from thread " << n << '\n'; std::atomic_flag_clear_explicit(&lock, std::memory_order_release); } } int main() { std::vector<std::thread> v; for (int n = 0; n < 10; ++n) { v.emplace_back(f, n); } for (auto& t : v) { t.join(); } }
Вывод:
Output from thread 2 Output from thread 6 Output from thread 7 ...<exactly 1000 lines>...
[править] См. также
| (C++11) |
безблокировочного логическое атомного типа Original: the lock-free boolean atomic type The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (класс) |
| (C++11) (C++11) |
атомарно устанавливает значение флага false Original: atomically sets the value of the flag to false The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (функция) |
| (C++11) |
определяет памяти заказе ограничений для данного атомарные операции Original: defines memory ordering constraints for the given atomic operation The text has been machine-translated via Google Translate. You can help to correct and verify the translation. Click here for instructions. (определение типа) |
| C документация для atomic_flag_test_and_set, atomic_flag_test_and_set_explicit
| |