2015-01-23 5 views
1

Мне нужно разделить boost :: deadline_timer между двумя потоками. В дополнительной документации говорится: «Общие экземпляры не являются потокобезопасными». Вот пример кода:Share deadline_timer между двумя потоками

ClassA : public enable_shared_from_this<ClassA>{ 

    ClassA() 
    { 
    m_timer = new boost::deadline_timer(m_io_service); 
    } 

    destroy() 
    { 
    m_timer->cancel(); 
    delete m_timer; 
    m_timer = NULL; 
    } 

    thread_method() 
    { 
    m_timer->expire_from_now(...); 
    m_timer->async_wait(...); 
    } 

    run() 
    { 
    boost::thread t(ClassA::thread_method, shared_from_this); 
    } 
} 

Мой вопрос «Для синхронизации доступа таймера между Destroy() и thread_method(), можно использовать повышение :: атомное

Заголовок:

boost::atomic<boost::deadline_timer*> m_timer; 

Конструктор

m_timer = new boost::deadline_timer(m_io_service); 

Это поточно-безопасный?

спасибо.

+0

Вы пробовали компиляции свой собственный код, чтобы увидеть, если вам есть какие-то проблемы? – inetknght

+0

@inetknght, почему вы должны знать? Он действительно не просит помощи в ошибках компилятора или некоторых таких. Я думаю, что там достаточно информации (если не _too much_). – sehe

+0

Код компилируется, но иногда я имею сбой, потому что поток пытается получить доступ к m_timer, а другой поток удалил m_timer. Поэтому я думаю, что мне нужно использовать мьютекс в destroy() и thread_method(), no? – user1886318

ответ

3

Нет, это не поможет.

Атомный производит только магазины/грузы указателя неделимый. Когда вы разыгрываете это, вы просто обращаетесь непосредственно к deadline_timer, несинхронизированным.

Таким образом, вы можете

  • только традиционная синхронизация потоков вокруг всех обращений к таймеру крайнего срока (например, с использованием mutex)

  • использовать Asio strand создать «логическую» поток выполнения , и позаботьтесь только о доступе к таймеру тайм-линии из этой нити.

подход прядь является потенциально более эффективным, но требует, чтобы думать о потоке выполнения более точно, чтобы вы случайно не создать расу данных

+0

Я буду использовать мьютекс, это проще. Благодарю. – user1886318

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