Bagikan melalui


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 multithread yang dirancang dengan baik. Namun, menggunakan serat dapat mempermudah port aplikasi yang dirancang untuk menjadwalkan utas mereka sendiri.

Dari sudut simpul 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 yang menjalankannya. Selain itu, jika serat memanggil fungsiExitThread, 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 dipertahankan 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 secara preemptive. Anda menjadwalkan serat dengan beralih ke serat lain. Sistem masih menjadwalkan utas untuk dijalankan. Ketika utas yang menjalankan serat didahului, serat yang sedang berjalan didahului tetapi tetap dipilih. Serat yang dipilih berjalan ketika utasnya berjalan.

Sebelum menjadwalkan serat pertama, panggil fungsiConvertThreadToFiber 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 untuk ConvertThreadToFiber.

FungsiCreateFiber 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 akan 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 makroGetFiberData. Serat dapat mengambil alamat serat kapan saja dengan memanggil makroGetCurrentFiber.

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 panggilan serat yang sedang berjalan 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 dihentikan secara tidak normal karena tumpukan serat telah dibebaskan.

Menggunakan Fiber