Serat

Serat adalah unit eksekusi yang harus dijadwalkan secara manual oleh aplikasi. Serat berjalan dalam konteks utas yang menjadwalkannya. Setiap utas dapat menjadwalkan beberapa serat. Secara umum, serat tidak memberikan keuntungan daripada aplikasi multithreaded yang dirancang dengan baik. Namun, menggunakan serat dapat mempermudah aplikasi port yang dirancang untuk menjadwalkan utas mereka sendiri.

Dari sudut pendapat sistem, operasi yang dilakukan oleh serat dianggap telah dilakukan oleh utas yang menjalankannya. Misalnya, jika serat mengakses penyimpanan lokal utas (TLS), serat mengakses penyimpanan lokal utas dari utas yang menjalankannya. Selain itu, jika serat memanggil fungsi ExitThread , utas yang menjalankannya keluar. Namun, serat tidak memiliki semua informasi status yang sama yang terkait dengannya seperti yang terkait dengan utas. Satu-satunya informasi status yang dikelola untuk serat adalah tumpukannya, subset register-nya, dan data serat yang disediakan selama pembuatan serat. Register yang disimpan adalah sekumpulan register yang biasanya dipertahankan di seluruh panggilan fungsi.

Serat tidak dijadwalkan terlebih dahulu. Anda menjadwalkan serat dengan beralih ke serat lain. Sistem masih menjadwalkan utas untuk dijalankan. Ketika serat yang menjalankan utas didahului, serat yang saat ini berjalan didahului tetapi tetap dipilih. Serat yang dipilih berjalan ketika utasnya berjalan.

Sebelum menjadwalkan serat pertama, panggil fungsi ConvertThreadToFiber untuk membuat area tempat menyimpan informasi status serat. Utas panggilan sekarang menjadi serat yang sedang dieksekusi. Informasi status tersimpan untuk serat ini mencakup data serat yang diteruskan sebagai argumen ke ConvertThreadToFiber.

Fungsi CreateFiber digunakan untuk membuat serat baru dari serat yang ada; panggilan memerlukan ukuran tumpukan, alamat awal, dan data serat. Alamat awal biasanya merupakan fungsi yang disediakan pengguna, yang disebut fungsi serat, yang mengambil satu parameter (data serat) dan tidak mengembalikan nilai. Jika fungsi serat Anda kembali, utas yang menjalankan serat keluar. Untuk menjalankan serat apa pun yang dibuat dengan CreateFiber, panggil fungsi SwitchToFiber . Anda dapat memanggil SwitchToFiber dengan alamat serat yang dibuat oleh utas yang berbeda. Untuk melakukan ini, Anda harus memiliki alamat yang dikembalikan ke utas lain ketika disebut CreateFiber dan Anda harus menggunakan sinkronisasi yang tepat.

Serat dapat mengambil data serat dengan memanggil makro GetFiberData . Serat dapat mengambil alamat serat kapan saja dengan memanggil makro GetCurrentFiber .

Penyimpanan Lokal Serat

Serat dapat menggunakan penyimpanan lokal serat (FLS) untuk membuat salinan unik variabel untuk setiap serat. Jika tidak ada pengalihan serat yang terjadi, FLS bertindak sama persis dengan penyimpanan lokal utas. Fungsi FLS (FlsAlloc, FlsFree, FlsGetValue, dan FlsSetValue) memanipulasi FLS yang terkait dengan utas saat ini. Jika utas mengeksekusi serat dan serat dialihkan, FLS juga dialihkan.

Untuk membersihkan data yang terkait dengan serat, panggil fungsi DeleteFiber . Data ini mencakup tumpukan, subset register, dan data serat. Jika fiber yang sedang berjalan memanggil DeleteFiber, utasnya memanggil ExitThread dan berakhir. Namun, jika serat utas yang dipilih dihapus oleh serat yang berjalan di utas lain, utas dengan serat yang dihapus kemungkinan akan berakhir secara tidak normal karena tumpukan serat telah dibebaskan.

Menggunakan Fiber