2009-08-02 23 views
10

Tôi có một mong muốn cho các biến điều kiện kiểu POSIX trên Win32. Tôi có một số mã mà cần phải chạy trên XP, vì vậy tôi không thể sử dụng Vista/Server 2008's CONDITION_VARIABLE.Thực hiện các biến điều kiện cho CRITICAL_SECTION cho Winthread cho XP

Hiện tại, nó sử dụng một lớp biến điều kiện giả, dựa trên việc rời khỏi phần quan trọng và báo hiệu sự kiện đặt lại tự động cho báo hiệu/thức dậy. Để chờ đợi trên biến điều kiện, nó rời khỏi phần quan trọng, WaitForSingleObject s trên sự kiện, và sau đó reenters phần quan trọng. Điều này là tốt, nhưng nó không hỗ trợ phát sóng, và có thể có các vấn đề khác liên quan đến công bằng, mà tôi không quan tâm quá nhiều về.

Chúng tôi sử dụng tăng, vì vậy tôi biết mình có thể sử dụng chuỗi tăng hoặc pthreads-win32, hỗ trợ các biến điều kiện, nhưng lý tưởng là tôi muốn giao diện được như vậy mà tôi có thể thả vào thực hiện của Microsoft khi/nếu nó có thể sử dụng nó trực tiếp. Tôi đã thấy Strategies for Implenting POSIX Condition Variables on Win32, nhưng giải pháp "tốt nhất" (chính xác nhất) sử dụng Mutex chứ không phải là CRITICAL_SECTION. Có một bản phác thảo về việc triển khai với một CRITICAL_SECTION trong second part, nhưng nó không đầy đủ và các giải pháp khác với CRITICAL_SECTION s lo lắng cho tôi do những lo ngại được nêu trong bài viết.

Tóm lại, làm cách nào để thực hiện đúng, không nhất thiết phải công bằng (nhưng điều đó sẽ tốt đẹp), biến điều kiện trên win32 cho các phần quan trọng sao cho tôi có thể thực hiện Microsoft khi nó có sẵn cho tôi?

Trả lời

6

Các giấy tờ mà bạn giới thiệu được viết bởi các đồng nghiệp của tôi như là một sự phát triển của công việc của chúng tôi trên khuôn khổ ACE C++ và mặt nạ bao bọc hệ điều hành của nó. Như đã đề cập trong tiểu sử của tôi, "Tôi không làm Windows", nhưng tôi vẫn tích cực làm việc trên ACE, và tôi chỉ cần xem xét, và nó xuất hiện rằng việc thực hiện biến điều kiện cho Win32 sử dụng CRITICAL_SECTION (trên kiểm tra ban đầu có vẻ như nó chỉ cần sử dụng một mutex, nhưng nếu bạn đào sâu hơn, bạn sẽ thấy rằng có một lớp bên dưới trong đó một mutex được định nghĩa là CRITICAL_SECTION trên nền tảng windows).

FYI, để đảm bảo rằng mã không được sửa đổi để sử dụng API Vista mới, cơ sở mã tôi đã kiểm tra thực sự là một nhánh ngoài dòng 1.5.

Giả sử bạn chỉ muốn một API C cho các biến điều kiện và không phải trình bao bọc C++ xung quanh nó, tất cả điều này nên được chứa trong một tập hợp tệp: ace/OS_NS_Thread.{h,inl,cpp} Giấy phép trên ACE rất hào phóng và không phải GPL, vì vậy bạn có thể nâng mã từ đó vào cơ sở mã độc quyền mà không sợ "ô nhiễm GPL".

Bạn có thể nhận bản phát hành ACE tại http://download.dre.vanderbilt.edu/; phiên bản tôi kiểm tra là bản phát hành được hỗ trợ thương mại có nguồn gốc từ ACE 5.5.2, được duy trì bởi OCI và có sẵn để tải xuống tại http://www.theaceorb.com/downloads/1.5a/index.html.

Vì lợi ích của việc tiết lộ đầy đủ, tôi đã là người dùng/người đóng góp/duy trì lâu năm cho ACE, đã làm việc với nhân viên nghiên cứu đó một thời gian và bây giờ là nhân viên của OCI. Tôi không nghĩ rằng thay đổi tiện ích/khả năng áp dụng của mã này cho bạn, cũng như không làm bất kỳ thực thể nào nói trên lấy được doanh thu từ bạn nâng mã từ nguồn.

+0

Có vẻ ổn! Cảm ơn nhiều. –

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