Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.02.2013, 19:14   #1
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию C++11 Memory order

Доброго дня!
Объясните пожалуйста разницу между memory_order_acquire и memory_order_consume. Пишу сюда, потому как запарился читать на не родном языке (не русском) и не находить четкого ответа (может не доходит из-за языкого барьера). Что я знаю о memory_order_acquire? То, что перед чтением с этой меткой ядро произведет обновление своего окружения (обработка входного буфера). Что иначе при memory_order_consume?

Последний раз редактировалось 220Volt; 21.02.2013 в 21:05.
220Volt вне форума Ответить с цитированием
Старый 21.02.2013, 22:19   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

http://msdn.microsoft.com/ru-ru/library/hh874698.aspx
Круто микрососы загнули...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 21.02.2013, 22:42   #3
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Вам из этого действительно понятна разница? Может я не умный, но не понимаю. Вот как реализованы операции над atomic_flag (у меня):
Код:
…
switch (_Order)
		{
		case memory_order_relaxed:
			return (_InterlockedExchange_nf(_Flag, 1));

		case memory_order_consume:
		case memory_order_acquire:
			return (_InterlockedExchange_acq(_Flag, 1));

		case memory_order_release:
			_Memory_barrier();
			return (_InterlockedExchange_nf(_Flag, 1));

		case memory_order_acq_rel:
		case memory_order_seq_cst:
			return (_InterlockedExchange(_Flag, 1));

		default:
			_INVALID_MEMORY_ORDER;
			return (0);
		}
…
220Volt вне форума Ответить с цитированием
Старый 21.02.2013, 22:49   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Вам из этого действительно понятна разница?
Да нет, наоборот!
Я ж и говорю "Круто микрософтовцы наумничали...".
Как по мне речь идет о работе в уже запрошенной (памяти, которая была запрошена уже по мере работы программы) памяти, если в ней есть свободная дыра.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 22.02.2013, 07:38   #5
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Подумал стебетесь ))
220Volt вне форума Ответить с цитированием
Старый 22.02.2013, 09:30   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Подумал стебетесь ))
Не. Это разработчики выстебнулись )
И робот-переводчик
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.08.2014, 21:47   #7
220Volt
Форумчанин
 
Регистрация: 14.12.2012
Сообщений: 668
По умолчанию

Кто-нибудь может объяснить:
Код:
#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 (lock.test_and_set(std::memory_order_acquire))  // acquire lock
             ; // spin
        std::cout << "Output from thread " << n << '\n';
        lock.clear(std::memory_order_release);               // release lock
    }
}
 
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();
    }
}
Почему в строке while (lock.test_and_set(std::memory_orde r_acquire)), используется memory_order_acquire, а не memory_order_acq_rel?

Мои мысли: установили флаг в true, а другим ядрам не сообщили. В результате, в критическую секцию может войти несколько потоков.

Пример из http://en.cppreference.com/w/cpp/atomic/atomic_flag

Я так понимаю, что для проверки таких вещей нужен weakly-ordered процессор, таким не обладаю.
220Volt вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Load exe into memory and run it from memory artush1984 Win Api 10 06.02.2012 18:43
order by like more LevonNikox PHP 3 03.06.2011 19:41
mysql order by and order by LevonNikox PHP 2 03.06.2011 14:01
Tab Order valdemar593 Win Api 0 01.11.2010 10:30
ORDER BY Sidorow2001 Microsoft Office Access 1 17.02.2010 17:19