2015-03-31 23 views
9

derleyemiyor Bir iş parçacığından yazmak ve başka bir iş parçacığından okumak istediğim std::chrono::high_resolution_clock::time_point alanına ihtiyacım var. Kodumun herhangi bir hata olmadan derlenmesi gibi bildirirsem. Ben bir iplikle yazmak ve okumak std::chrono::high_resolution_clock::time_point alanı ilan etmesi nasılstd :: atomic <std :: chrono :: high_resolution_clock :: time_point>

/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; 

: Bu std::atomic<std::chrono::high_resolution_clock::time_point> gibi std::atomic ile onu çevreleyen ve şimdi şu var derleme hatası başka bir iş parçacığı alanım görünür kılmak için Ama

Başka birinden ("okuma ipliğinin" son değeri gördüğünden emin olmak için)?

+5

'atomic 'yalnızca önemsiz olarak kopyalanabilir tiplerle kullanılabilir ve' time_point '' in önemsiz bir şekilde kopyalanabileceğini garanti edemediğim kadarıyla. –

+0

T.C. doğru diyor. Ve sen kullanabilirsiniz [std :: is_trivial veya diğer] (http://en.cppreference.com/w/cpp/types/is_trivial) test ... –

cevap

8

Seçenekleriniz: o atomik hale unutup erişim

  • tefrika bir muteksi kullanmak (Dönemden beri örn milisaniye) zaman bazı ayrılmaz birimini almak ve bu konuda/from dönüştürmek

    • uçtuğunuz şekilde, çalıştığınız bazı integral tipte integral değerini saklamak, taşıdığınız tarih aralığını (belki de std::atomic_ullong)

    • [bütünlük için/tavsiye edilmez. Uygulamanızın nesne doğrudan time_point değerini tutmak için olursa NDED], sen tanımsız davranış benimsemesi ve aynı boyutta ayrılmaz bir tip std::atomic_ullong x;x.store(*reinterpret_cast<unsigned long long*>(&my_time_point));/*reinterpret_cast<unsigned long long*>(&my_time_point) = x.load();

    ala time_point, kopyalama saklayabilir umut olabilir
  • +0

    teşekkürler 'time_cast gibi bir şey ikinci bir yaklaşım deneyeceğim (time_point.time_since_epoch()) count() ' – javapowered

    +0

    Tony, ilk iki mermi noktasında iyiyken, UB'nin kabul edilebilir bir ihtimal olabileceğini düşünmek için bir bıyıkla gelen * herhangi bir * cevabı veremem :-) – paxdiablo

    4

    std::atomic<std::chrono::high_resolution_clock::duration> kullanın ve saklarken time_point :: time_since_epoch() olarak ayarlayın; Yüklerken, atomikteki süreden, bunun için standart dönüşüm yapıcısı ile bir time_point oluşturun. Bunun gerekli olduğu konusunda biraz rahatsız edici olsa da, en azından güvenlidir ve atomik tipin boyutu veya çözünürlüğü hakkında bir belirsizlik yoktur.

    İlgili konular