I/O Pipa Sinkron dan Tumpang Tindih

Fungsi ReadFile, WriteFile, TransactNamedPipe, dan ConnectNamedPipe dapat melakukan operasi input dan output pada pipa baik secara sinkron atau asinkron. Ketika fungsi berjalan secara sinkron, fungsi tidak kembali sampai operasi yang dilakukannya selesai. Ini berarti bahwa eksekusi utas panggilan dapat diblokir untuk periode yang tidak terbatas sementara menunggu operasi yang memakan waktu selesai. Ketika fungsi berjalan secara asinkron, fungsi akan segera kembali, bahkan jika operasi belum selesai. Ini memungkinkan operasi yang memakan waktu untuk dijalankan di latar belakang sementara utas panggilan bebas untuk melakukan tugas lain.

Menggunakan I/O asinkron memungkinkan server pipa untuk menggunakan perulangan yang melakukan langkah-langkah berikut:

  1. Tentukan beberapa objek peristiwa dalam panggilan ke fungsi tunggu, dan tunggu salah satu objek diatur ke status disinyalkan.
  2. Gunakan nilai pengembalian fungsi tunggu untuk menentukan operasi mana yang tumpang tindih telah selesai.
  3. Lakukan tugas yang diperlukan untuk membersihkan operasi yang telah selesai dan memulai operasi berikutnya untuk handel pipa tersebut. Ini dapat melibatkan memulai operasi lain yang tumpang tindih untuk handel pipa yang sama.

Operasi yang tumpang tindih memungkinkan satu pipa membaca dan menulis data secara bersamaan dan untuk satu utas untuk melakukan operasi I/O simultan pada beberapa handel pipa. Ini memungkinkan server pipa satu alur untuk menangani komunikasi dengan beberapa klien pipa secara efisien. Misalnya, lihat Server Pipa Bernama Menggunakan I/O yang Tumpang Tindih.

Agar server pipa menggunakan operasi sinkron untuk berkomunikasi dengan lebih dari satu klien, server harus membuat utas terpisah untuk setiap klien pipa sehingga satu atau beberapa utas dapat berjalan saat utas lain menunggu. Untuk contoh server pipa multithreaded yang menggunakan operasi sinkron, lihat Multithreaded Pipe Server.

Mengaktifkan Operasi Asinkron

Fungsi ReadFile, WriteFile, TransactNamedPipe, dan ConnectNamedPipe dapat dilakukan secara asinkron hanya jika Anda mengaktifkan mode tumpang tindih untuk handel pipa yang ditentukan dan menentukan penunjuk yang valid ke struktur yang TUMPANG TINDIH . Jika penunjuk TUMPANG TINDIH ADALAH NULL, nilai pengembalian fungsi dapat salah menunjukkan bahwa operasi telah selesai. Oleh karena itu, sangat disarankan bahwa jika Anda membuat handel dengan FILE_FLAG_OVERLAPPED dan menginginkan perilaku asinkron, Anda harus selalu menentukan struktur TUMPANG TINDIH yang valid.

Anggota hEvent dari struktur TUMPANG TINDIH yang ditentukan harus berisi handel ke objek peristiwa reset manual. Ini adalah objek sinkronisasi yang dibuat oleh fungsi CreateEvent . Utas yang memulai operasi yang tumpang tindih menggunakan objek peristiwa untuk menentukan kapan operasi telah selesai. Anda tidak boleh menggunakan handel pipa untuk sinkronisasi saat melakukan operasi bersamaan pada handel yang sama karena tidak ada cara untuk mengetahui penyelesaian operasi mana yang menyebabkan handel pipa diberi sinyal. Satu-satunya teknik yang dapat diandalkan untuk melakukan operasi simultan pada handel pipa yang sama adalah menggunakan struktur TUMPANG TINDIH terpisah dengan objek peristiwanya sendiri untuk setiap operasi. Untuk informasi selengkapnya tentang objek peristiwa, lihat Sinkronisasi.

Selain itu, Anda dapat diberi tahu ketika operasi yang tumpang tindih selesai dengan menggunakan fungsi GetQueuedCompletionStatus atau GetQueuedCompletionStatusEx . Dalam hal ini, Anda tidak perlu menetapkan peristiwa reset manual dalam struktur YANG TUMPANG TINDIH , dan penyelesaian terjadi terhadap handel pipa dengan cara yang sama seperti operasi baca atau tulis asinkron. Untuk informasi selengkapnya, lihat Port Penyelesaian I/O.

Ketika operasi ReadFile, WriteFile, TransactNamedPipe, dan ConnectNamedPipe dilakukan secara asinkron, salah satu hal berikut ini terjadi:

  • Jika operasi selesai saat fungsi kembali, nilai yang dikembalikan menunjukkan keberhasilan atau kegagalan operasi. Jika terjadi kesalahan, nilai yang dikembalikan adalah nol dan fungsi GetLastError mengembalikan sesuatu selain ERROR_IO_PENDING.
  • Jika operasi belum selesai saat fungsi kembali, nilai yang dikembalikan adalah nol dan GetLastError mengembalikan ERROR_IO_PENDING. Dalam hal ini, utas panggilan harus menunggu sampai operasi selesai. Utas panggilan kemudian harus memanggil fungsi GetOverlappedResult untuk menentukan hasilnya.

Menggunakan Rutinitas Penyelesaian

Fungsi ReadFileEx dan WriteFileEx menyediakan bentuk lain dari I/O yang tumpang tindih. Tidak seperti fungsi ReadFile dan WriteFile yang tumpang tindih, yang menggunakan objek peristiwa untuk penyelesaian sinyal, fungsi yang diperluas menentukan rutinitas penyelesaian. Rutinitas penyelesaian adalah fungsi yang diantrekan untuk eksekusi ketika operasi baca atau tulis selesai. Rutinitas penyelesaian tidak dijalankan sampai utas yang disebut ReadFileEx dan WriteFileEx memulai operasi tunggu yang dapat diperingatkan dengan memanggil salah satu fungsi tunggu yang dapat diperingatkan dengan parameter fAlertable diatur ke TRUE. Dalam operasi tunggu yang dapat diperingatkan, fungsi juga kembali ketika rutinitas penyelesaian ReadFileEx atau WriteFileEx diantrekan untuk eksekusi. Server pipa dapat menggunakan fungsi yang diperluas untuk melakukan urutan operasi baca dan tulis untuk setiap klien yang terhubung ke dalamnya. Setiap operasi baca atau tulis dalam urutan menentukan rutinitas penyelesaian, dan setiap penyelesaian rutin memulai langkah berikutnya dalam urutan. Misalnya, lihat Server Pipa Bernama Menggunakan Rutinitas Penyelesaian.