2015-03-31 9 views
9

Potrzebuję std::chrono::high_resolution_clock::time_point pola, które chcę napisać z jednego wątku i czytać z innego wątku. Jeśli deklaruję to tak, jak mój kod kompiluje się bez żadnych błędów.std :: atomowy <std :: chrono :: high_resolution_clock :: time_point> nie można skompilować

Ale aby moje pole widoczne w innym wątku, że otaczają go std::atomic jak ta std::atomic<std::chrono::high_resolution_clock::time_point> a teraz mam następujący błąd kompilacji:

/usr/include/c++/4.8/atomic:167:7: error: function ‘std::atomic<_Tp>::atomic() [with _Tp = std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > >]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘constexpr std::atomic<std::chrono::time_point<std::chrono::_V2::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000000l> > > >::atomic()’ 
     atomic() noexcept = default; 

Jak należy zadeklarować std::chrono::high_resolution_clock::time_point pole, które piszę od jednego wątku i czytać z innego (aby upewnić się, że "wątek do czytania" widzi ostatnią wartość)?

+5

'atomowy' może być używany tylko z trywialnie kopiowanymi typami, i o ile mogę powiedzieć, nie ma gwarancji, że' time_point' jest trywialnie kopiowalny. –

+0

T.C. mówi, że ma rację. I możesz użyć [std :: is_trivial lub innego] (http://en.cppreference.com/w/cpp/types/is_trivial) przetestuj to ... –

Odpowiedz

8

Twoje wybory:

  • zapomnieć o co atomowej i używać mutex do serialise Dostęp

  • odebrać jakąś integralną jednostkę czasu (np milisekund od epoki) i konwersji do/z, że w dniu mucha, przechowywania wartości w pewnym integralną integralną typu już wypracowanej ma wystarczającą pojemność, aby pokryć zakres dat jesteś magazynowe (może std::atomic_ullong)

  • [kompletności/nie recomme wyładowanych] jeśli realizacja stanie utrzymać wartość time_point bezpośrednio w obiekcie, można objąć niezdefiniowane zachowanie i mamy nadzieję, że integralną typ tej samej wielkości mogą przechowywać time_point, kopiowanie ala std::atomic_ullong x;x.store(*reinterpret_cast<unsigned long long*>(&my_time_point));/*reinterpret_cast<unsigned long long*>(&my_time_point) = x.load();

+0

dzięki Spróbuję drugie podejście, coś jak 'duration_cast (time_point.time_since_epoch()). count() ' – javapowered

+0

Tony, podczas gdy pierwsze dwa punkty są dobre, nie mogę przegłosować * żadnej * odpowiedzi, która pojawia się w wąskim przejściu, co sugeruje najmniejszą możliwą akceptację UB :-) – paxdiablo

4

Użyj std::atomic<std::chrono::high_resolution_clock::duration> i ustaw go na time_point :: time_since_epoch() podczas przechowywania; podczas ładowania należy skonstruować punkt czasowy z czasu trwania w obiekcie atomowym za pomocą standardowego konstruktora konwersji. To trochę irytujące, że jest to konieczne, ale przynajmniej jest bezpieczne i nie ma wątpliwości co do rozmiaru lub rozdzielczości typu atomowego.

Powiązane problemy