2011-07-09 9 views
6

Bazı nanosaniye için uyumak için bir destek iş parçacığı istiyorum. Aşağıdaki kod, hatasız derleyen bir örnektir. Ancak, beklendiği gibi çalışmıyor ve nedenini anlayamıyorum.Bazı nanosaniye için bir destek iş parçacığı uyuyor

#include <iostream> 
#include <boost/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time.hpp> 
//Building options: 
//-DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG -lboost_date_time-mt -lboost_thread-mt 
void replay() 
{ 
    boost::posix_time::time_duration time1, time2; 

    time1=boost::posix_time::seconds(3); 
    std::cout << boost::posix_time::to_simple_string(time1) << std::endl; 
    boost::this_thread::sleep(time1); 

    time2=boost::posix_time::nanoseconds(987654321); 
    std::cout << boost::posix_time::to_simple_string(time2) << std::endl; 
    boost::this_thread::sleep(time2); 
} 
int main(int argc, char* argv[]) 
{ 
    boost::thread replaythread(replay); 
    replaythread.join(); 
    return 0; 
} 

BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG nanosaniye (more info) ile çalışmak için gerekli bir önişlemci tanımıdır. Sorunlar -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG yapı seçeneğini ayarladığımda oluşur, daha sonra destek :: this_thread :: uyku herhangi bir posix :: time_duration için çalışmaz. Oluşturulan iş parçacığı tüm CPU'yu kullanır ve uyumadığı gibi kalan talimatları da işlemez. Önişlemci tanımı kaldırılırsa, iş parçacığı :: posix_time :: nanosconds değilse, iş parçacığı herhangi bir süre için uyuyabilir. Program, nanosaniye saklamak için bazı time_duration değişkenlerini kullanır ve bu da şu şekilde desteklenir :: this_thread :: sleep çalışmıyor.

Eğer fonksiyonun dönüş değerini kontrol edin ve sıfır dönünceye kadar tekrar çağırmak zorunda kesilen zaman

+1

sen çalışmıyor onunla ne anlama geliyor? Kısa mı yoksa uzun mu ya da hiç uyumuyor mu? Std :: cout çizgisinin nanosec ile çıktısı nedir? – Nobody

+0

Haklısınız. Yayını daha iyi bir açıklama ile düzenledim. Teşekkür ederim. – Emer

+0

Programı, destek için debuginformation ile bağlamaya ve uyurken neler olup bittiğine bakmaya çalıştınız mı? Benim için yoğun bir bekleyişe benziyor, çünkü nanosaniye için uyku için başka bir olasılık olmadığı için net. Belki beklemekte olan döngü hiçbir sebepten dolayı geri dönmez. – Nobody

cevap

7

BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG, ptime boyutunu değiştirir.

boost::this_thread::sleep, bu tanımlama olmadan derlenmiş (derlemenizde) derlenmiş bir işlevdir, bu nedenle mikro saniye kesinlikli ptime argümanlarını bekler. Nanosaniye duyarlıklı ptime argümanlarını geçiyorsunuz ve işlev başarısız oluyor.

Eğer boost kitaplığından kodunu ayıklamak ve bu etkin tanımlamak ile derlemek, program beklendiği gibi çalışır:

#include <iostream> 
#include <boost/thread.hpp> 
#include <boost/date_time/posix_time/posix_time.hpp> 
#include <boost/date_time.hpp> 

// the guts of boost_1_46_1/libs/pthread/thread.cpp's version of sleep() 
boost::mutex sleep_mutex; 
boost::condition_variable sleep_condition; 
void mysleep(const boost::posix_time::time_duration& dur) 
{ 
    boost::system_time st = boost::get_system_time() + dur; 
    boost::unique_lock<boost::mutex> lk(sleep_mutex); 
    while(sleep_condition.timed_wait(lk, st)); 
} 

void replay() 
{ 
    boost::posix_time::time_duration time1, time2; 

    time1=boost::posix_time::seconds(3); 
    std::cout << boost::posix_time::to_simple_string(time1) << std::endl; 
    mysleep(time1); 
    //boost::this_thread::sleep(time1); 

    time2=boost::posix_time::nanoseconds(987654321); 
    std::cout << boost::posix_time::to_simple_string(time2) << std::endl; 
    mysleep(time2); 
    //boost::this_thread::sleep(time2); 
} 
int main() 
{ 
    boost::thread replaythread(replay); 
    replaythread.join(); 
    return 0; 
} 
+1

(bu kodun sadece demo olduğunu unutmayın, çünkü benim mutex ve condvar'ım evrenseldir, gerçek kütüphanede ise onlar desteksiz notastatik üyeleridirler.) – Cubbi

+0

Yararlı cevabınız için çok teşekkür ederim. Konu kütüphanesini 'b2' kullanarak tanımlamak için kurmaya çalışıyorum. Varyant new_release satırını ekledim: BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG; '' user-config.jam' yerine başarı. Tanımlama seçeneğini nereye ekleyeceğinizi biliyor musunuz? – Emer

2

Bazı uyku fonksiyonları erken dönmek zaman için size çok teşekkür ederim.