Konteks

Dokumen ini menjelaskan peran konteks dalam Runtime Konkurensi. Utas yang dilampirkan ke penjadwal dikenal sebagai konteks eksekusi, atau hanya konteks. Fungsi konkurensi::tunggu dan konkurensi::Kelas konteks memungkinkan Anda mengontrol perilaku konteks. wait Gunakan fungsi untuk menangguhkan konteks saat ini untuk waktu yang ditentukan. Context Gunakan kelas saat Anda memerlukan lebih banyak kontrol ketika konteks memblokir, membuka blokir, dan menghasilkan, atau ketika Anda ingin berlangganan konteks saat ini secara berlebihan.

Tip

Runtime Konkurensi menyediakan penjadwal default, dan oleh karena itu Anda tidak diharuskan untuk membuatnya di aplikasi Anda. Karena Task Scheduler membantu Anda menyempurnakan performa aplikasi Anda, kami sarankan Anda memulai dengan Pustaka Pola Paralel (PPL) atau Pustaka Agen Asinkron jika Anda baru menggunakan Runtime Konkurensi.

Fungsi tunggu

Fungsi konkurensi::tunggu secara kooperatif menghasilkan eksekusi konteks saat ini untuk sejumlah milidetik yang ditentukan. Runtime menggunakan waktu hasil untuk melakukan tugas lain. Setelah waktu yang ditentukan berlalu, runtime menjadwalkan ulang konteks untuk eksekusi. Oleh karena itu, wait fungsi mungkin menangguhkan konteks saat ini lebih lama dari nilai yang disediakan untuk milliseconds parameter .

Meneruskan 0 (nol) untuk milliseconds parameter menyebabkan runtime menangguhkan konteks saat ini hingga semua konteks aktif lainnya diberi kesempatan untuk melakukan pekerjaan. Ini memungkinkan Anda menghasilkan tugas ke semua tugas aktif lainnya.

Contoh

Untuk contoh yang menggunakan wait fungsi untuk menghasilkan konteks saat ini, dan dengan demikian memungkinkan konteks lain dijalankan, lihat Cara: Menggunakan Grup Jadwal untuk Memengaruhi Urutan Eksekusi.

Kelas Konteks

Kelas konkurensi::Konteks menyediakan abstraksi pemrograman untuk konteks eksekusi dan menawarkan dua fitur penting: kemampuan untuk secara kooperatif memblokir, membuka blokir, dan menghasilkan konteks saat ini, dan kemampuan untuk kelebihan langganan konteks saat ini.

Pemblokiran Koperasi

Kelas ini Context memungkinkan Anda memblokir atau menghasilkan konteks eksekusi saat ini. Pemblokiran atau menghasilkan berguna ketika konteks saat ini tidak dapat dilanjutkan karena sumber daya tidak tersedia.

Metode konkurensi::Context::Block memblokir konteks saat ini. Konteks yang diblokir menghasilkan sumber daya pemrosesannya sehingga runtime dapat melakukan tugas lain. Metode konkurensi::Konteks::Buka blokir membuka blokir konteks yang diblokir. Metode Context::Unblock harus dipanggil dari konteks yang berbeda dari yang disebut Context::Block. Runtime melempar konkurensi::context_self_unblock jika konteks mencoba membuka blokir itu sendiri.

Untuk memblokir dan membuka blokir konteks secara kooperatif, Anda biasanya memanggil konkurensi::Context::CurrentContext untuk mengambil pointer ke Context objek yang terkait dengan utas saat ini dan menyimpan hasilnya. Anda kemudian memanggil Context::Block metode untuk memblokir konteks saat ini. Kemudian, panggil Context::Unblock dari konteks terpisah untuk membuka blokir konteks yang diblokir.

Anda harus mencocokkan setiap pasangan panggilan ke Context::Block dan Context::Unblock. Runtime melempar konkurensi::context_unblock_unbalanced ketika Context::Block metode atau Context::Unblock dipanggil secara berturut-turut tanpa panggilan yang cocok ke metode lain. Namun, Anda tidak perlu menelepon Context::Block sebelum memanggil Context::Unblock. Misalnya, jika satu konteks memanggil Context::Unblock sebelum konteks lain memanggil Context::Block konteks yang sama, konteks tersebut tetap tidak diblokir.

Metode konkurensi::Context::Yield menghasilkan eksekusi sehingga runtime dapat melakukan tugas lain dan kemudian menjadwalkan ulang konteks untuk eksekusi. Saat Anda memanggil Context::Block metode , runtime tidak menjadwalkan ulang konteks.

Contoh

Misalnya yang menggunakan Context::Blockmetode , Context::Unblock, dan Context::Yield untuk mengimplementasikan kelas semaphore kooperatif, lihat Cara: Menggunakan Kelas Konteks untuk Menerapkan Semaphore Kooperatif.

Permintaan berlebih

Penjadwal default membuat jumlah utas yang sama dengan utas perangkat keras yang tersedia. Anda dapat menggunakan oversubscription untuk membuat utas tambahan untuk utas perangkat keras tertentu.

Untuk operasi intensif komputasi, oversubscription biasanya tidak menskalakan karena memperkenalkan overhead tambahan. Namun, untuk tugas yang memiliki latensi dalam jumlah tinggi, misalnya, membaca data dari disk atau dari koneksi jaringan, oversubscription dapat meningkatkan efisiensi keseluruhan beberapa aplikasi.

Catatan

Aktifkan oversubscription hanya dari utas yang dibuat oleh Concurrency Runtime. Oversubscription tidak berpengaruh ketika dipanggil dari utas yang tidak dibuat oleh runtime (termasuk utas utama).

Untuk mengaktifkan oversubscription dalam konteks saat ini, panggil metode konkurensi::Context::Oversubscribe dengan parameter yang _BeginOversubscription diatur ke true. Saat Anda mengaktifkan oversubscription pada utas yang dibuat oleh Concurrency Runtime, itu menyebabkan runtime membuat satu utas tambahan. Setelah semua tugas yang memerlukan oversubscription selesai, panggil Context::Oversubscribe dengan parameter yang _BeginOversubscription diatur ke false.

Anda dapat mengaktifkan oversubscription beberapa kali dari konteks saat ini, tetapi Anda harus menonaktifkannya berapa kali Anda mengaktifkannya. Oversubscription juga dapat ditumpuk; artinya, tugas yang dibuat oleh tugas lain yang menggunakan oversubscription juga dapat menggantikan konteksnya. Namun, jika tugas berlapis dan induknya termasuk dalam konteks yang sama, hanya panggilan terluar yang Context::Oversubscribe menyebabkan pembuatan utas tambahan.

Catatan

Runtime melempar konkurensi::invalid_oversubscribe_operation jika oversubscription dinonaktifkan sebelum diaktifkan.

Contoh

Untuk contoh yang menggunakan oversubscription untuk mengimbangi latensi yang disebabkan oleh membaca data dari koneksi jaringan, lihat Cara: Menggunakan Oversubscription untuk Mengimbangi Latensi.

Baca juga

Tugas Microsoft Azure Scheduler
Cara: Menggunakan Grup Jadwal untuk Memengaruhi Urutan Eksekusi
Cara: Menggunakan Kelas Konteks untuk Menerapkan Koperasi Semaphore
Cara: Menggunakan Oversubscription untuk Mengimbangi Latensi