هل من الممكن استخدام IOCP (أو أي واجهة برمجة تطبيقات أخرى) في عمليات على غرار المفاعل؟

StackOverflow https://stackoverflow.com/questions/2530625

سؤال

هل هناك أي واجهة برمجة تطبيقات Win32 قابلة للتطوير (مثل IOCP ليس مثل Select) تمنحك عمليات نمط المفاعل على مآخذ؟ تتيح لك AFAIK IOCP تلقي إشعار في العمليات المكتملة مثل قراءة البيانات أو المكتوبة (Proactor) ، لكنني أبحث عن نمط العمليات مفاعل: أحتاج إلى الحصول على إشعار عندما يكون المقبس قابلاً للقراءة أو قابلاً للكتابة (مفاعل).

شيء مشابه لـ Epoll ، Kqueue ، /dev/poll ?

هل هناك واجهة برمجة تطبيقات في Win32؟ إذا كان الأمر كذلك ، فأين يمكنني العثور على دليل عليه؟

** التوضيح: ** أحتاج select مثل API للمآخذ القابلة للتطوير مثل IOCP ، أو أنا أبحث عن وسيلة لاستخدام IOCP في مفاعل مثل العمليات.

حتى المزيد من التوضيح: يتيح لك IOCP تلقي إشعار عند الانتهاء من العملية المحددة. علي سبيل المثال:

WSARecv(buffer,...); // start reading
WSAWaitForMultipleEvents(...); // wait when read is done

لذلك أحصل على الإشعار بعد تتم العملية - نمط العمليات.

ما أحتاجه هو شيء من هذا القبيل:

WSARecv( NOTHING ); // start waiting for readability (not actual read)
WSAWaitForMultipleEvents(...); // wait until read would not block
// Now WSARecv would not block
WSARecv(buffer,...); // now actual non-blocking read

كيف يمكنني أن أفعل هذا؟

هل كانت مفيدة؟

المحلول 3

غير ممكن.

لقد قمت بفحص BOOST.Asio المصادر التي لديها عمليات نمط المفاعل وتستخدم IOCP. لجميع عمليات نمط المفاعل سلسلة منفصلة مع select يستخدم بدلا من IOCP.

نصائح أخرى

تريد أن تنظر إلى WSAASYNCSELECT API. يستخدم قائمة انتظار رسائل Windows للإشارة إلى أن المقبض يتم قراءته للقراءة/الكتابة/أيا كان ، لذلك لا يحتوي على فوائد التزامن لـ IOCP ، ولكنه يتيح لك تنفيذ نمط مفاعل قياسي دون وجود حد لعدد مقابض (مثل WSAWaitForMultipleEvents).

أنا في حيرة من أمري ، أليس نمط المفاعل حيث ينتظر الخيط في مصادر أحداث متعددة؟ سيكون ذلك SELECT () ، وهو ما يدعمه Windows. نمط Proactor هو المكان الذي يوجد فيه رد اتصال واحد لكل مكالمة ، ويمكنك القيام به عبر ReadFileex/WriteFileex.

هل حاولت تمرير صفر nnumberofbytestoread ، على سبيل المثال ReadFile (socket_fd ، ..)؟

ربما سيساعد ذلك في الحصول على حدث "قراءة جاهزة".

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top