2011-09-06 23 views
15

Tôi có nhiệm vụ chặn sẽ được thực hiện bởi hàm find_the_question(). Tuy nhiên, tôi không muốn thread thực hiện chức năng này mất hơn 10 giây. Vì vậy, trong trường hợp mất hơn 10 giây, tôi muốn đóng chủ đề đó bằng cách làm sạch tất cả các tài nguyên.Chủ đề tăng tốc - Cách xác nhận ngắt

Tôi đã cố gắng viết mã cho điều đó, nhưng bằng cách nào đó tôi không thể nhận được ngắt trong hàm find_the_question() nếu chuỗi mất hơn 10 giây. Bạn có thể vui lòng cho tôi biết tôi đang làm gì sai?

void find_the_question(std::string value) 
{ 
    //allocate x resources 
    try{ 
     //do some process on resources 
      sleep(14); 
     //clean resources 
    } 
    catch(boost::thread_interrupted const&) 
    { 
     //clean resources 
     std::cout << "Worker thread interrupted" << std::endl; 
    } 
} 

int main() 
{ 
     boost::posix_time::time_duration timeout = boost::posix_time::milliseconds(10000); 
     std::cout << "In main" << std::endl; 
     boost::thread t1(find_the_question, "Can you block me"); 

     t1.interrupt(); 
     if (t1.timed_join(timeout)) 
     { 
      //finished 
      std::cout << "Worker thread finished" << std::endl; 
     } 
     else 
     { 
      //Not finished; 
      std::cout << "Worker thread not finished" << std::endl; 
     } 

     std::cout << "In main end" << std::endl; 
} 

Đầu ra: Nếu t1 mất hơn 10 giây để hoàn thành, tôi nhận được kết quả đầu ra sau đây.

std::cout << "In main" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

trong khi, tôi đang mong đợi sau đầu ra

std::cout << "In main" << std::endl; 
std::cout << "Worker thread interrupted" << std::endl; 
std::cout << "Worker thread not finished" << std::endl; 
std::cout << "In main end" << std::endl; 

Ông có thể xin vui lòng cho tôi biết những gì tôi làm sai.

Cảm ơn trước

+5

'Ngủ (14);' mà bạn đang sử dụng. Đây có phải là giấc ngủ từ 'boost :: thread' hay là chức năng ngủ c? Bởi vì ngắt chỉ hoạt động trên 'boost :: thread: sleep' – mkaes

Trả lời

25

Đối với việc sử dụng tăng :: Chủ đề :: ngắt(), bạn phải sử dụng tăng :: Chủ đề :: ngủ() cho nó để làm việc.

Một luồng đang chạy có thể bị gián đoạn bằng cách gọi hàm ngắt() gián đoạn của đối tượng tăng :: thread tương ứng. Khi chuỗi bị gián đoạn tiếp theo thực hiện một trong các gián đoạn được chỉ định điểm (hoặc nếu nó hiện bị chặn trong khi thực thi một) với gián đoạn được bật, thì tăng :: ngoại lệ thread_interrupted sẽ được ném trong chuỗi bị gián đoạn. Nếu không bị bắt, điều này sẽ gây ra việc thực hiện chuỗi bị gián đoạn để chấm dứt. Như với bất kỳ ngoại lệ khác, ngăn xếp sẽ được unwound, và destructor cho đối tượng của thời gian lưu trữ tự động sẽ được thực hiện

điểm gián đoạn Predefined:

Các chức năng sau là những điểm bị gián đoạn, mà sẽ ném tăng :: thread_interrupted nếu gián đoạn được bật cho luồng hiện tại và yêu cầu gián đoạn cho luồng hiện tại:

boost::thread::join() 
boost::thread::timed_join() 
boost::condition_variable::wait() 
boost::condition_variable::timed_wait() 
boost::condition_variable_any::wait() 
boost::condition_variable_any::timed_wait() 
boost::thread::sleep() 
boost::this_thread::sleep() 
boost::this_thread::interruption_point() 
Các vấn đề liên quan