Я использую volatile bool в течение многих лет для управления исполнением потоков, и он отлично работал
// in my class declaration
volatile bool stop_;
-----------------
// In the thread function
while (!stop_)
{
do_things();
}
Теперь, поскольку С++ 11 добавила поддержку для атомных операций, я решил попробовать вместо этого
// in my class declaration
std::atomic<bool> stop_;
-----------------
// In the thread function
while (!stop_)
{
do_things();
}
Но он на несколько порядков медленнее, чем volatile bool
!
Простой тестовый сценарий, который я написал, занимает около 1 секунды для завершения подхода volatile bool
. С std::atomic<bool>
однако я ждал около 10 минут и сдался!
Я попытался использовать флаг memory_order_relaxed
с load
и store
с тем же эффектом.
Моя платформа: Windows 7 64 бит MinGW gcc 4.6.x
Что я делаю неправильно?
UPD
Да, я знаю, что volatile не делает переменную нить безопасной. Мой вопрос не о неустойчивом, о том, почему атомный смехотворно медленный.
UPD2 @all, спасибо за ваши комментарии - я попробую все предлагаемые, когда я доберусь до своей машины сегодня вечером.