2010-05-16 29 views
9

Tôi đang xem xét sử dụng các chủ đề C++ 0x trong ứng dụng của tôi thay vì các chủ đề Boost. Tuy nhiên, tôi không chắc chắn làm thế nào để reimplement những gì tôi có với tiêu chuẩn C + + 0x chủ đề vì họ dường như không có một phương pháp interrupt().Làm thế nào để ngắt chuỗi chờ C++ 0x?

thiết lập hiện tại của tôi là:

  • a thread chủ quản lý công việc;
  • một số chuỗi công việc thực hiện các lệnh của chủ.

Công nhân gọi wait() trên ít nhất hai biến điều kiện khác nhau. Thạc sĩ có trạng thái "hết thời gian": trong trường hợp này, nó yêu cầu tất cả các nhân viên dừng lại và đưa ra bất kỳ kết quả nào họ nhận được sau đó. Với chủ đề Boost master chỉ sử dụng interrupt_all() trên một nhóm chủ đề, khiến cho người lao động ngừng chờ đợi. Trong trường hợp họ không chờ đợi tại thời điểm này, chủ cũng đặt cờ bool mà người lao động kiểm tra định kỳ.

Tuy nhiên, trong C++ 0x std::thread Tôi không thấy bất kỳ sự thay thế nào cho interrupt(). Tôi có nhớ điều gì không? Nếu không, làm thế nào tôi có thể thực hiện các chương trình trên để công nhân không thể ngủ mãi mãi?

Trả lời

9

Thật không may là tôi không thấy cách nào khác hơn là bỏ phiếu, thay vì sử dụng chờ đợi, hãy đợi thời gian chờ đợi và một biến cho biết việc gián đoạn đã được thực hiện.

void th(Interruptor& interruptor) { 
    try { 

    ... 

    while (cnd1.timed_wait(d)==false) { 
     interruptor.check_interruption_point(); 
    } 
    ... 
    } catch (interrupted_exception &) {} 
} 

Lớp Interruptor sẽ duy trì một biến boolean bảo vệ với một mutex hoặc sử dụng các hoạt động hạt nhân nếu bạn có chúng và hai chức năng gián đoạn và check_interruption_point, mà với ném một interrupted_exception nếu boolean là đúng. Chủ đề Mater sẽ tạo ra một biến Interruptor sẽ được gán cho các chủ đề có liên quan tại thời điểm tạo. Thạc sĩ có khả năng làm gián đoạn cùng một lúc tất cả các chủ đề phụ thuộc vào bộ ngắt này. Tất nhiên bạn có thể tạo một bộ ngắt cho mỗi luồng nếu bạn muốn ngắt một luồng một cách rõ ràng tại một thời điểm.

Tùy thuộc vào bạn để xác định khoảng thời gian chờ đợi theo thời gian, do đó, chủ đề của bạn có thể phản ứng ngay khi chương trình của bạn yêu cầu.

+0

Tôi nghĩ rằng tôi sẽ tiếp tục sử dụng chủ đề Boost sau đó. Họ cũng bị lỗi, nhưng ít nhất tôi có một giải pháp ổn định cho họ. – doublep

1

Chờ tăng khi ngắt() là phát ra một thông báo trên điều kiện mà luồng hiện bị chặn và sau đó kiểm tra xem có bị gián đoạn hay không. Nếu một sự gián đoạn được yêu cầu thì nó thực hiện một cú ném mạnh :: thread_interrupted. Bạn có thể viết một chủ đề của riêng bạn lớp dựa trên std :: thread với cơ chế.

+2

Và có lẽ viết subclass điều kiện của riêng tôi để thread biết những gì nó chờ đợi? Điều này nghe có vẻ hơi quá nhiều với tôi. – doublep

1

Thật vậy, C++ 11 std :: thread không cung cấp cơ chế tiêu chuẩn cho điều này (chưa?). Do đó, quyết định thứ hai của @ doublep sử dụng boost :: thread trong thời gian này.

Chúng tôi muốn sử dụng C++ 11 std :: facilities. Nhưng chúng tôi không muốn xây dựng lại cơ sở terminate() của boost, hoàn chỉnh với biến điều kiện để làm gián đoạn giấc ngủ, v.v., không có lý do gì. Tạo cơ sở hạ tầng như vậy là thú vị và không khó khăn, nhưng không hiệu quả và kém tiêu chuẩn hơn so với việc sử dụng tăng.

Nó giúp tăng :: thread và std :: thread tương tự như vậy mà chúng tôi cảm thấy chúng tôi không vẽ ourself vào một góc. (Chúng tôi hy vọng di chuyển cuối cùng để std :: thread để được tương đối dễ dàng, có lẽ thậm chí tầm thường.)

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