std::atomic_flag_test_and_set, std::atomic_flag_test_and_set_explicit
Материал из cppreference.com
|
|
Эта страница была переведена автоматически с английской версии вики используя Переводчик Google. Перевод может содержать ошибки и странные формулировки. Наведите курсор на текст, чтобы увидеть оригинал. Щёлкните здесь, чтобы увидеть английскую версию этой страницы. (Вы можете помочь в исправлении ошибок и улучшении перевода. Для инструкций перейдите по ссылке.) |
<metanoindex/>
<tbody> </tbody>| Определено в заголовочном файле <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) и возвращает значение, оно состоится до. Оригинал:
Atomically changes the state of a std::atomic_flag pointed to by
p to set (true) and returns the value it held before. Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Параметры
| p | — | Указатель на std::atomic_flag доступа
Оригинал: pointer to std::atomic_flag to access Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
| order | — | Чтобы синхронизации памяти для этой операции
Оригинал: the memory synchronization order for this operation Текст был переведён автоматически используя Переводчик Google. Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда. |
Возвращаемое значение
Значение ранее занимал флаг указывает
pОригинал:
The value previously held by the flag pointed to by
pТекст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Исключения
спецификация noexcept:
noexceptВозможная реализация
| Первый вариант |
|---|
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
Оригинал:
A spinlock mutex can be implemented in userspace using an atomic_flag
Текст был переведён автоматически используя Переводчик Google.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Вы можете проверить и исправить перевод. Для инструкций щёлкните сюда.
Запустить этот код
#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) |
свободный от блокировок логический атомарный тип (класс) |
(C++11)(C++11) |
атомарно устанавливает значение флага в false (функция) |
(C++11) |
определяет ограничения порядка памяти для данной атомарной операции (перечисление) |
Документация C по atomic_flag_test_and_set, atomic_flag_test_and_set_explicit
| |