2016-09-25 3 views
3
std::atomic<int> unique_ids; 

void foo() {  
    int i = unique_ids.fetch_add(1, std::memory_order_relaxed); 
    std::cout<<i; 
} 

int main(int argc, char* argv[]) { 
    std::vector<std::thread> threads; 
    for (int i = 0; i < 9; ++i) { 
     threads.emplace_back(foo); 
    } 

    for (int i = 0; i < 9; ++i) { 
     threads[i].join(); 
    } 
    std::cout << std::endl; 
    return 0; 
} 

Моя цель - использовать атомный для генерации уникального идентификатора для программы параллелизма, но меня не интересуют заказы.Понимание порядка памяти ослаблено в C++

Для приведенного выше кода я понимаю, что выходные значения в foo должны отличаться, хотя их заказы не гарантируются.

Я проверил вышеуказанный код сто раз, и все результаты - то, что я ожидал. Я новичок в атомизме/памяти, может ли кто-нибудь помочь мне прояснить мое понимание?

Заранее спасибо. Aimin

P.S. Я хотел бы отметить, что этот вопрос не совпадает с тем, что у меня c++,std::atomic, what is std::memory_order and how to use them, так как мой вопрос касается понимания памяти_order_relaxed, а не общего вопроса об объяснении порядка атомов и памяти.

+2

@ πάνταῥεῖ Речь идет о 'memory_order_relaxed' не' memory_order'. – nbro

+3

@ πάνταῥεῖ Я думаю, что мой вопрос не совпадает с тем, что [C++, std :: atomic, что такое std :: memory_order и как их использовать] (http://stackoverflow.com/questions/9553591/c-stdatomic -what-is-stdmemory-order-and-how-to-use-them), так как мой вопрос конкретно касается понимания memory_order_relaxed. Благодарю. –

+0

@ πάνταῥεῖ Речь идет об определенной проблеме, а не о какой-то концепции вообще. Неверное дублирование. – 2501

ответ

2

Это законное использование расслабленной памяти. Вам просто нужна операция, чтобы быть атомарной по отношению к другим доступам к самому самому атомному. Каждая атомная операция имеет эту характеристику, независимо от порядка памяти, или вообще не будет атомом.

+0

std :: atomic unique_ids; for (int i = 0; i <10; ++ i) { unique_ids.fetch_add (1, std :: memory_order_relaxed); } int ten = unique_ids.load (std :: memory_order_release); Основываясь на понимании, я думаю, что переменной десяти гарантировано будет 10, не так ли? –

+0

@AiminHuang Предполагая, что 'unique_ids' начинается с нуля. Я не помню, будет ли оно установлено равным нулю, если вы его не инициализируете. –

+0

Спасибо за разъяснение. Я буду инициализировать unique_ids в моем коде. :) –

Смежные вопросы