В чем разница в памяти_order_seq_cst с другим порядком памяти?

69
4

Есть ли таблица, которая суммирует разницу в порядке памяти?
например, какую ситуацию использовать каждый порядок памяти


Кроме того, в чем разница между порядком памяти и (data_cond и future)?


is it 
1. memory order is for waiting
2. data_cond is for waiting
3. future is for doing other thing while waiting

спросил(а) 2020-03-25T18:40:53+03:00 6 месяцев, 1 неделя назад
1
Решение
70

Запросы памяти используются для указания порядка памяти в атомных операциях. Самый простой порядок памяти - memory_order_seq_cst, который дает вам последовательную согласованность. Другие модели памяти дают расслабленные порядки в моделях.


Если вы хотите получить заказ на выпуск-релиз, вы должны объединить: memory_order_consume, memory_order_acquire, memory_order_release и
memory_order_acq_rel.


Если вы хотите получить расслабленный заказ, вы должны использовать memory_order_relaxed.


Вот простой пример использования порядка памяти для реализации мьютекса спин-блокировки:


class spinlock_mutex {
private:
std::atomic_flag f;
public:
spinlock_mutex() : f(ATOMIC_FLAG_INIT) {}

void lock() {
while (f.test_and_set(std::memory_order_acquire)) {}
}

void unlock() {
flag.clear(std::memory_order_release());
}
};

В С++ 11 есть тип data_cond. Я полагаю, вы можете ссылаться на std::condition_variable, который является переменной условия, которая должна быть связана с мьютексом.


std::mutex m;
std::queue<request> q;
std::condition_variable cv;

void producer() {
while (more_data()) {
request r = generate_request();
std::lock_guard<std::mutex> l(m);
q.push(r);
cv.notify_one();
}
}

void consumer() {
for (;;) {
std::unique_lock<std::mutex> l(m);
cv.wait(l, []{ return !q.empty();});
request r = q.front();
l.unlock();
process_request(r);
if (is_last(r)) break;
}
}


Наконец, будущее позволяет потоку вернуть значение в раздел кода, который сделал вызов.


int main() {
std::future<int> r = std::async(do_something, 1, 10);
do_something_else();
std::cout << "Result= " << r.get() << std::endl;
return 0;
}

ответил(а) 2020-03-25T18:57:08.331395+03:00 6 месяцев, 1 неделя назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема