Bagikan melalui


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. WriteFile, ReadFile, DeviceIoControl, waitCommEvent, ConnectNamedPipe, dan fungsi TransactNamedPipe dapat dilakukan secara sinkron atau asinkron. FungsiReadFileEx danWriteFileEx hanya dapat dilakukan secara asinkron.

Ketika fungsi dijalankan secara sinkron, fungsi tidak kembali sampai operasi selesai. Ini berarti bahwa eksekusi utas panggilan dapat diblokir selama periode yang tidak terbatas sementara menunggu operasi yang memakan waktu selesai. Fungsi yang dipanggil untuk operasi 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, utas panggilan menggunakan fungsiGetOverlappedResult, fungsi GetOverlappedResultEx, atau salah satu fungsi tunggu untuk menentukan kapan operasi yang tumpang tindih telah selesai. Anda juga dapat menggunakan makroHasOverlappedIoCompleted untuk polling untuk penyelesaian.

Untuk membatalkan semua operasi I/O asinkron yang tertunda, gunakan fungsiCancelIoEx dan berikan strukturTUMPANG 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 fungsiReadFile) untuk melakukan operasi yang tumpang tindih, utas panggilan harus menentukan penunjuk ke strukturTUMPANG TINDIH. (Jika pointer ini NULL, nilai pengembalian fungsi mungkin salah menunjukkan bahwa operasi selesai.) Semua anggota struktur TUMPANG TINDIH harus diinisialisasi ke nol kecuali peristiwa akan digunakan untuk memberi sinyal penyelesaian operasi I/O. Jika peristiwa digunakan, hEvent anggota struktur TUMPANG TINDIH menentukan handel ke objek peristiwa yang dialokasikan. Sistem mengatur status objek peristiwa ke nonsignaled ketika panggilan ke fungsi I/O kembali sebelum operasi selesai. Sistem mengatur status objek peristiwa yang akan disinyalir 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 diselesaikan 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 fungsiGetLastErrormengembalikan ERROR_IO_PENDING.

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

  • Gunakan getOverlappedResult atau fungsi GetOverlappedResultEx untuk menunggu operasi yang tumpang tindih selesai. Jika GetOverlappedResultEx digunakan, utas panggilan dapat menentukan batas waktu untuk operasi yang tumpang tindih atau melakukan tunggu yang dapat diingat.
  • Tentukan handel ke objek peristiwa reset manual struktur 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, ia melaporkan jumlah byte aktual yang ditransfer.

Saat melakukan beberapa operasi tumpang tindih simultan pada satu utas, utas panggilan harus menentukan strukturTUMPANG TINDIH untuk setiap operasi. Setiap struktur TUMPANG TINDIH harus menentukan handel ke objek peristiwa reset manual yang berbeda. Untuk menunggu salah satu operasi yang tumpang tindih selesai, utas menentukan semua handel peristiwa pengaturan ulang manual sebagai kriteria tunggu di salah satu fungsi tunggu beberapa objek. Nilai pengembalian fungsi tunggu beberapa objek menunjukkan objek peristiwa pengaturan ulang 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 strukturTUMPANG TINDIH, sistem memberi sinyal status file, bernama pipa, 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, ketika melakukan operasi tumpang tindih bersamaan pada file yang sama, pipa bernama, atau perangkat komunikasi, tidak ada cara untuk mengetahui operasi mana yang menyebabkan status objek disinyalir.

Utas tidak boleh menggunakan kembali peristiwa dengan asumsi bahwa peristiwa hanya akan disinyalir 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 balapan 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.

Untuk contoh yang mengilustrasikan penggunaan operasi yang tumpang tindih, rutinitas penyelesaian, dan fungsiGetOverlappedResult, lihat Menggunakan Pipa.

Windows Vista, Windows Server 2003, dan Windows XP:

Berhati-hatilah saat menggunakan kembali strukturTUMPANG TINDIH. Jika struktur TUMPANG TINDIH digunakan kembali pada beberapa utas dan GetOverlappedResult dipanggil dengan parameter bWait diatur ke TRUE, alur panggilan harus memastikan bahwa peristiwa terkait diberi sinyal sebelum menggunakan kembali struktur. Ini dapat dicapai dengan menggunakan fungsiWaitForSingleObject setelah memanggil GetOverlappedResult untuk memaksa utas menunggu hingga operasi selesai. Perhatikan bahwa objek peristiwa harus berupa objek peristiwa reset manual. Jika objek peristiwa pengaturan otomatis 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 Application Manifests.

Konsep I/O