Глобальная переменная в пространстве имен — значения различаются в потоках

Рассмотрим следующий сценарий:

  • 2 разных сетевых порта через boost::asioкаждый в своем потоке
  • 1 порт получает и обрабатывает данные — класс DataConnectionзавернутый в std::thread
  • 1 порт для отправки статистики class StatConnectionтакже завернутый в std::thread

Для подсчета соединений (и других небольших данных штук) моя идея состояла в том, чтобы использовать статическуюпеременную внутри пространства имен, например:

#include <atomic>

namespace app {
 namespace status {
   static std::atomic<long> counter = 0; 
 }
}

Это прекрасно работает для класса DataConnection. Здесь я увеличиваю счетчик в c'tor и вижу увеличение значения.

Но counterв моем классе StatConnectionвсегда 0

Почему это может произойти?

Я пробовал некоторые альтернативы:

  • замена std::atomicна static volatile long: ничего не изменилось.
  • используя пространство имен без ключевого слова static.

Затем я получил ошибки компоновщика:

multiple definition of `app::status::searchtime'
./src/status/Status.o:/[...]/include/status/Status.hpp:16: first defined here
[...]

Так почему же значение countразличается между потоками?

5
задан mt_ 26 June 2012 в 23:44
поделиться