2011-07-09 36 views
6

Tôi muốn một sợi chỉ tăng để ngủ trong vài nano giây. Đoạn mã sau là một mẫu biên dịch không có lỗi. Tuy nhiên, nó không hoạt động như mong đợi và tôi không thể hiểu tại sao.Ngủ một sợi chỉ tăng cho một số nano giây

#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; 
} 

Các BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG là một định nghĩa preprocessor cần thiết để làm việc với nano giây (more info). Các vấn đề xảy ra khi tôi đặt tùy chọn xây dựng -DBOOST_DATE_TIME_POSIX_TIME_STD_CONFIG, sau đó tăng :: this_thread :: sleep không hoạt động với bất kỳ posix :: time_duration nào. Chủ đề được tạo sử dụng tất cả CPU và nó không ngủ cũng như không xử lý các hướng dẫn còn lại. Nếu định nghĩa tiền xử lý được loại bỏ, luồng có thể ngủ trong bất kỳ khoảng thời gian nào trừ khi tăng :: posix_time :: nano giây. Chương trình sử dụng một số biến thời gian để lưu trữ nano giây và điều đó làm tăng :: this_thread :: sleep không hoạt động.

Cảm ơn bạn rất nhiều vì thời gian của bạn

+1

Ý anh là gì với nó không hoạt động? Nó có ngủ ngắn hay dài hay không? Đầu ra của std :: cout line với các nanosec là gì? – Nobody

+0

Bạn nói đúng. Tôi đã chỉnh sửa bài đăng với mô tả tốt hơn. Cảm ơn bạn. – Emer

+0

Bạn đã thử liên kết chương trình với thông tin gỡ lỗi để tăng cường và xem điều gì đang xảy ra khi đang ngủ? Đối với tôi, nó nghe có vẻ như một sự chờ đợi bận rộn, rõ ràng là không có khả năng nào khác để ngủ cho nano giây bởi vì điều đó vượt xa giới hạn của lịch trình. Có lẽ vòng lặp chờ đợi không bao giờ trả về vì một lý do nào đó. – Nobody

Trả lời

7

Các BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG thay đổi kích thước của ptime.

boost::this_thread::sleep là một hàm được biên dịch, được biên dịch (trên bản phân phối của bạn) mà không có định nghĩa đó, do đó, nó mong đợi đối số ptime chính xác micro giây. Bạn đang chuyển các đối số ptime chính xác nano giây và hàm không thành công.

Nếu bạn trích xuất mã từ thư viện boost và biên dịch nó với điều này xác định được kích hoạt, chương trình hoạt động như mong đợi:

#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

(lưu ý rằng mã này chỉ là bản demo, vì mutex và condvar của tôi là toàn cầu, trong khi trong thư viện thực chúng là thành viên không phải là thành viên của lớp :: thread thread) – Cubbi

+0

Cảm ơn bạn rất nhiều vì câu trả lời hữu ích của bạn. Tôi đang cố gắng xây dựng thư viện luồng với định nghĩa đó bằng cách sử dụng 'b2'. Tôi đã thêm dòng 'variant new_release: release: BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG;' vào 'user-config.jam' mà không thành công. Bạn có biết phải bao gồm tùy chọn xác định không? – Emer

2

Một số chức năng ngủ trở lại sớm khi interupted vì vậy bạn phải kiểm tra giá trị trả về của hàm và gọi nó một lần nữa cho đến khi họ trở về zero.

Các vấn đề liên quan