2011-10-28 18 views
6

Yükseltme kitaplığı ile ilgili bir sorunum var. Aşağıdaki kodu derlemek için gcc 4.5.2 ile MinGW kullanıyorum:MinGW altında ptime hızını artırın iş parçacığı için güvenli değil

unsigned long GetEpochSeconds() 
{ 
    using namespace boost::posix_time; 
    using namespace boost::gregorian; 

    ptime now(second_clock::universal_time()); 
    ptime epoch(date(1970,1,1)); 
    time_duration diff = now-epoch; 
    return diff.total_seconds(); 
} 

sorun bu kod parçacığı için güvenli değil olmasıdır. Birden çok iş parçacığı içinden çalıştırdığımda, uygulama çöküyor. Şimdilik zaman, mktime vb. Gibi c-standart işlevlere dönüştürdüm ve her şey iyi çalışıyor, ancak gelecekte birkaç destek zaman fonksiyonuna ihtiyacım olacak.

Ayrıca -D_REENTRANT ile derledim, ancak bu yardımcı olmadı.

Önerileriniz için teşekkür ederiz.

+0

Her şeyi -mthreads ile derlediniz mi? – rubenvb

+0

Denedim ama sonuç yok. – kappa

+0

Performans isabeti çok büyük değilse, bir muteks içinde sarabilirsiniz. – sje397

cevap

2

Kodunuzun gmtime() veya gmtime_r() öğesini çağırıp aramadığını kontrol edin (bunun için bir hata ayıklayıcı kullanın). http://www.boost.org/doc/libs/1_48_0/boost/date_time/c_time.hpp numaralı telefona bakın ve zamanın iş parçacığı olmasını sağlamak için BOOST_DATE_TIME_HAS_REENTRANT_STD_FUNCTIONS öğesinin tanımlanması gerektiğini unutmayın.

+0

Uygulamanın Visual Studio'da 'localtime_s' ve' gmtime_s' kullanılmadığı gerçekten üzücü/kötü ... – dalle

+0

@dalle: Windows programlama hakkında pek bir şey bilmiyorum, ama onlar bile _s işlevlerini kullanmak için derleyici uyarılarını devre dışı bırakma sorunu. Neden bir yama göndermiyorsunuz ya da en azından Boost posta listesindeki değişikliği önermiyorsunuz? –

+1

Düzenli 'localtime 've' gmtime' işlevlerine kod bakmak Visual Studio CRT kitaplıkları kullanarak iş parçacığı güvenlidir. Onlar reentrant değil, ama her thread kendi dahili 'struct tm' arabelleğini kullanıyor. – dalle

İlgili konular