2012-06-16 35 views
6

http://msdn.microsoft.com/en-us/library/windows/desktop/ms686289%28v=vs.85%29.aspxKhi một chuỗi gọi lệnh SetWaitableTimer thoát trong khi một chuỗi khác đang chờ trên bộ hẹn giờ, bộ hẹn giờ có bị hủy không?

Theo MSDN, trong các phần nhận xét, nó khẳng định: "Nếu các chủ đề mà thiết lập chấm dứt hẹn giờ và có một thói quen hoàn thành đi kèm, bộ đếm thời gian bị hủy Tuy nhiên, tình trạng của phần còn lại hẹn giờ. .. không thay đổi Nếu không có thói quen hoàn thành, sau đó chấm dứt thread không ảnh hưởng đến bộ đếm thời gian "

sau đó tiếp tục xuống, nó nói: " Nếu các chủ đề đó gọi là thoát SetWaitableTimer, hẹn giờ đã được hủy bỏ. Điều này dừng bộ đếm thời gian trước khi nó có thể được đặt ở trạng thái được báo hiệu và hủy bỏ các APC nổi bật; không thay đổi trạng thái tín hiệu của bộ hẹn giờ. "

Do đó câu hỏi của tôi, nếu tôi có một thread gọi SetWaitableTimer mà không có một thói quen hoàn thành liên quan và một thread gọi WaitOnMultipleObjects (đi qua trong giờ đối tượng xử lý) và các chủ đề mà các cuộc gọi SetWaitiableTmer thoát ngay sau đó, sẽ đối tượng timer bị hủy bỏ hoặc nó vẫn sẽ được báo hiệu khi hết thời hạn?

Trả lời

3

Tài liệu này có phần không rõ ràng.Tôi nghĩ rằng tốt nhất bạn có thể làm là tự mình thử nghiệm. Tuy nhiên, tôi tin rằng bộ hẹn giờ sẽ tự động hủy nếu hoàn thành I/O thường được sử dụng

Tôi có thể cung cấp một số "lý thuyết" backg vòng quanh các cửa sổ APC, để biện minh cho dự đoán của tôi.

APC = "gọi thủ tục không đồng bộ". Trong các cửa sổ, mỗi luồng chế độ người dùng được trang bị một hàng đợi APC, một hàng đợi được quản lý hệ thống phải được gọi trên luồng này. Một luồng có thể nhập vào trạng thái "chờ đợi có thể cảnh báo" (theo mục đích), trong đó nó có thể thực thi một hoặc nhiều thủ tục trong hàng đợi này. Bạn có thể thực hiện cuộc gọi thủ tục trong hàng đợi APC theo cách thủ công hoặc phát hành I/O, khi hoàn thành sẽ "đặt" cuộc gọi thủ tục ở đó.

Nói cách đơn giản, kịch bản như sau: bạn phát hành một số I/O, và sau đó bạn chờ một trong hai thành viên đó hoàn thành (hoặc thất bại), và, có lẽ, một số sự kiện khác. Sau đó, bạn gọi một trong các chức năng chờ cảnh báo: SleepEx, WaitForMultipleObjectsEx hoặc tương tự.

Lưu ý quan trọng: cơ chế này được thiết kế để hỗ trợ đơn luồng đồng thời. Tức là, cùng một luồng đề cập đến một số I/O, chờ đợi một điều gì đó xảy ra, và đáp ứng một cách thích hợp. Tất cả các thủ tục của APC là được bảo đảm để được gọi trong số cùng một chủ đề. Do đó - nếu chuỗi này thoát - không có cách nào để gọi chúng. Do đó - tất cả I/O xuất sắc cũng bị hủy.

Có một số hàm API của Windows xử lý I/O không đồng bộ, trong khi chúng cho phép lựa chọn một số cơ chế hoàn thành (chẳng hạn như ReadFileEx): APC, đặt sự kiện hoặc hoàn thành cổng I/O . Nếu các chức năng đó được sử dụng với APC - chúng sẽ tự động hủy I/O nếu thoát khỏi chuỗi phát hành.

Do đó, tôi đoán rằng hẹn giờ có thể chờ tự động hủy chỉ khi được sử dụng với APC.

3

Để cung cấp thêm thông tin trực tiếp từ việc triển khai bộ đếm thời gian chờ: nếu bạn sử dụng CompletionRoutine, bộ hẹn giờ được đặt trên danh sách được liên kết bị chặn khỏi chuỗi được gọi là SetWaitableTimer.Khi luồng được kết thúc, hạt nhân sẽ đi vào danh sách liên kết của chuỗi chết và hủy bỏ các bộ đếm thời gian vẫn còn xếp hàng đợi.

Nếu bạn không sử dụng thói quen hoàn thành, bộ hẹn giờ không bao giờ được thêm vào danh sách liên kết của bất kỳ chuỗi nào và do đó không bị hủy khi bất kỳ chuỗi cụ thể nào bị chết.

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