2013-02-27 2 views
3

Предположим, у меня есть класс Foo:C++ атомный против замка

class foo { 
    static uint32 count_; 
    pthread_mutex_t mu; 

    void increase() { 
     pthread_mutex_lock(&mu); 
     count_++; 
     pthread_mutex_unlock(&mu); 
    } 
} 

Есть ли разница, если я не использую семафор, но только есть зЬй :: атомное, как count_?

Спасибо!

+0

'uint32' должно быть' uint32_t'. И я думаю, 'atomc32' является' std :: atomic '? http://en.cppreference.com/w/cpp/atomic/atomic – kay

+0

@OP Не могли бы вы пояснить, что вы подразумеваете под 'atomc32'? Если это из файла заголовка конкретной платформы, можете ли вы добавить информацию об этом? – jogojapan

+0

@jogojapan и код ядра Linux и FreeBSD использует атомный_32_t, но я совершенно уверен, что это не вопрос. ;) Но вы правы, я удалю тег C++ 11. – kay

ответ

4

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

Атомное решение на x86 будет простой операцией «блокировки». На других процессорах это может быть более сложным, но даже при том, что атом является минимальным, необходимым для мьютекса, поэтому у вас есть, по крайней мере, такой объем работы.

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

Итак, да, идем на атомный.

Но, как и все, что связано с производительностью, измерьте «до» и «после», чтобы увидеть, что он действительно улучшает производительность.

Обратите внимание, что я видел, как кто-то объяснил, что первоначальная реализация стандартной библиотеки gnu C++ была фактически выполнена с использованием какого-то мьютекса вокруг операции, но я считаю, что если у вас есть достаточно последняя версия g ++, это должно быть хорошо (по крайней мере для процессоров типа x86). Microsoft долгое время поддерживала правильные атомные операции как встроенные, поэтому должно быть хорошо. Другие архитектуры процессоров могут отличаться.

4

Существует огромная разница. pthread_mutex_lock может быть очень дорогим, поскольку он может включать в себя syscall *. Атомный приращение дает lock xadd.

Другим преимуществом является то, что std::atomic<...> может быть лучше переносимым, поскольку он является частью стандарта C++. Потребители Pthread, скорее всего, не будут работать в Windows.

*) Чтобы текущая нить спала, если блокировка уже удерживается какой-либо другой нитью. Но скорее всего произойдет только spinlock.

+0

, так что я могу просто объявить статический std :: atomic count_, а затем count _ ++? – WhatABeautifulWorld

+0

Точно. См. Http://en.cppreference.com/w/cpp/atomic/atomic/operator_arith. – kay

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