Sinkronisasi dan Input dan Output yang Tumpang Tindih

Anda dapat melakukan operasi I/O sinkron atau asinkron (juga disebut tumpang tindih) pada file, pipa bernama, dan perangkat komunikasi serial. Fungsi WriteFile, ReadFile, DeviceIoControl, WaitCommEvent, ConnectNamedPipe, dan TransactNamedPipe dapat dilakukan secara sinkron atau asinkron. Fungsi ReadFileEx dan WriteFileEx hanya dapat dilakukan secara asinkron.

Ketika fungsi dijalankan secara sinkron, fungsi tidak kembali sampai operasi selesai. Ini berarti bahwa eksekusi utas panggilan dapat diblokir untuk periode yang tidak terbatas sementara menunggu operasi yang memakan waktu selesai. Fungsi yang dipanggil untuk operasi yang tumpang tindih dapat segera kembali, meskipun operasi belum selesai. Ini memungkinkan operasi I/O yang memakan waktu untuk dijalankan di latar belakang sementara utas panggilan bebas untuk melakukan tugas lain. Misalnya, satu utas dapat melakukan operasi I/O simultan pada handel yang berbeda, atau bahkan operasi baca dan tulis simultan pada handel yang sama.

Untuk menyinkronkan eksekusinya dengan penyelesaian operasi yang tumpang tindih, alur panggilan menggunakan fungsi GetOverlappedResult , fungsi GetOverlappedResultEx , atau salah satu fungsi tunggu untuk menentukan kapan operasi yang tumpang tindih telah selesai. Anda juga dapat menggunakan makro HasOverlappedIoCompleted untuk melakukan polling untuk penyelesaian.

Untuk membatalkan semua operasi I/O asinkron yang tertunda, gunakan fungsi CancelIoEx dan berikan struktur TUMPANG TINDIH yang menentukan permintaan untuk dibatalkan. Gunakan fungsi CancelIo untuk membatalkan operasi I/O asinkron yang tertunda yang dikeluarkan oleh utas panggilan untuk handel file yang ditentukan.

Operasi yang tumpang tindih memerlukan file, pipa bernama, atau perangkat komunikasi yang dibuat dengan bendera FILE_FLAG_OVERLAPPED . Saat utas memanggil fungsi (seperti fungsi ReadFile ) untuk melakukan operasi yang tumpang tindih, utas panggilan harus menentukan penunjuk ke struktur YANG TUMPANG TINDIH . (Jika pointer ini NULL, nilai pengembalian fungsi mungkin salah menunjukkan bahwa operasi selesai.) Semua anggota struktur TUMPANG TINDIH harus diinisialisasi ke nol kecuali suatu peristiwa akan digunakan untuk memberi sinyal penyelesaian operasi I/O. Jika peristiwa digunakan, anggota hEvent dari struktur TUMPANG TINDIH menentukan handel ke objek peristiwa yang dialokasikan. Sistem mengatur status objek peristiwa ke tidak ditandatangani ketika panggilan ke fungsi I/O kembali sebelum operasi selesai. Sistem mengatur status objek peristiwa ke sinyal ketika operasi telah selesai. Peristiwa hanya diperlukan jika akan ada lebih dari satu operasi I/O yang luar biasa secara bersamaan. Jika peristiwa tidak digunakan, setiap operasi I/O yang selesai akan memberi sinyal file, pipa bernama, atau perangkat komunikasi.

Ketika fungsi dipanggil untuk melakukan operasi yang tumpang tindih, operasi mungkin selesai sebelum fungsi kembali. Ketika ini terjadi, hasilnya ditangani seolah-olah operasi telah dilakukan secara sinkron. Namun, jika operasi tidak selesai, nilai pengembalian fungsi adalah FALSE, dan fungsi GetLastError mengembalikan ERROR_IO_PENDING.

Utas dapat mengelola operasi yang tumpang tindih dengan salah satu dari dua metode:

  • Gunakan fungsi GetOverlappedResult atau GetOverlappedResultEx untuk menunggu operasi tumpang tindih selesai. Jika GetOverlappedResultEx digunakan, utas panggilan dapat menentukan batas waktu untuk operasi yang tumpang tindih atau melakukan penantian yang dapat diperingatkan.
  • Tentukan handel ke objek peristiwa reset manual struktur yang TUMPANG TINDIH di salah satu fungsi tunggu lalu, setelah fungsi tunggu kembali, panggil GetOverlappedResult atau GetOverlappedResultEx. Fungsi mengembalikan hasil operasi tumpang tindih yang selesai, dan untuk fungsi di mana informasi tersebut sesuai, fungsi melaporkan jumlah byte aktual yang ditransfer.

Saat melakukan beberapa operasi tumpang tindih simultan pada satu utas, utas panggilan harus menentukan struktur YANG TUMPANG TINDIH untuk setiap operasi. Setiap struktur YANG TUMPANG TINDIH harus menentukan handel ke objek peristiwa manual-reset yang berbeda. Untuk menunggu salah satu operasi yang tumpang tindih selesai, utas menentukan semua handel peristiwa reset manual sebagai kriteria tunggu di salah satu fungsi tunggu beberapa objek. Nilai kembali dari fungsi tunggu multi-objek menunjukkan objek peristiwa reset manual mana yang diberi sinyal, sehingga utas dapat menentukan operasi mana yang tumpang tindih menyebabkan operasi tunggu selesai.

Lebih aman menggunakan objek peristiwa terpisah untuk setiap operasi yang tumpang tindih, daripada menentukan tidak ada objek peristiwa atau menggunakan kembali objek peristiwa yang sama untuk beberapa operasi. Jika tidak ada objek peristiwa yang ditentukan dalam struktur TUMPANG TINDIH , sistem memberi sinyal status file, pipa bernama, atau perangkat komunikasi ketika operasi yang tumpang tindih telah selesai. Dengan demikian, Anda dapat menentukan handel ini sebagai objek sinkronisasi dalam fungsi tunggu, meskipun penggunaannya untuk tujuan ini dapat sulit dikelola karena, saat melakukan operasi tumpang tindih simultan pada file yang sama, pipa bernama, atau perangkat komunikasi, tidak ada cara untuk mengetahui operasi mana yang menyebabkan status objek disinyalkan.

Utas tidak boleh menggunakan kembali peristiwa dengan asumsi bahwa peristiwa hanya akan diberi sinyal oleh operasi tumpang tindih utas tersebut. Peristiwa disinyalir pada utas yang sama dengan operasi tumpang tindih yang sedang selesai. Menggunakan peristiwa yang sama pada beberapa utas dapat menyebabkan kondisi perlombaan di mana peristiwa disinyalir dengan benar untuk utas yang operasinya selesai terlebih dahulu dan prematur untuk utas lain menggunakan peristiwa tersebut. Kemudian, ketika operasi tumpang tindih berikutnya selesai, peristiwa disinyalir lagi untuk semua utas menggunakan peristiwa tersebut, dan sebagainya sampai semua operasi yang tumpang tindih selesai.

Misalnya yang menggambarkan penggunaan operasi yang tumpang tindih, rutinitas penyelesaian, dan fungsi GetOverlappedResult , lihat Menggunakan Pipa.

Windows Vista, Windows Server 2003, dan Windows XP:

Berhati-hatilah saat menggunakan kembali struktur yang TUMPANG TINDIH . Jika struktur TUMPANG TINDIH digunakan kembali pada beberapa utas dan GetOverlappedResult dipanggil dengan parameter bWait diatur ke TRUE, utas panggilan harus memastikan bahwa peristiwa terkait diberi sinyal sebelum menggunakan kembali struktur. Ini dapat dicapai dengan menggunakan fungsi WaitForSingleObject setelah memanggil GetOverlappedResult untuk memaksa utas menunggu hingga operasi selesai. Perhatikan bahwa objek peristiwa harus berupa objek peristiwa reset manual. Jika objek peristiwa autoreset digunakan, memanggil GetOverlappedResult dengan parameter bWait diatur ke TRUE menyebabkan fungsi diblokir tanpa batas waktu. Perilaku ini berubah dimulai dengan Windows 7 dan Windows Server 2008 R2 untuk aplikasi yang menentukan Windows 7 sebagai sistem operasi yang didukung dalam manifes aplikasi. Untuk informasi selengkapnya lihat Manifes Aplikasi.

Konsep I/O