Fungsi KeReleaseSemaphore (wdm.h)

Rutinitas KeReleaseSemaphore merilis objek semaphore yang ditentukan.

Sintaks

LONG KeReleaseSemaphore(
  [in, out] PRKSEMAPHORE Semaphore,
  [in]      KPRIORITY    Increment,
  [in]      LONG         Adjustment,
  [in]      BOOLEAN      Wait
);

Parameter

[in, out] Semaphore

Penunjuk ke objek semaphore yang diinisialisasi yang disediakan pemanggil penyimpanan.

[in] Increment

Menentukan kenaikan prioritas yang akan diterapkan jika melepaskan semaphore menyebabkan penantian terpenuhi.

[in] Adjustment

Menentukan nilai yang akan ditambahkan ke jumlah semaphore saat ini. Nilai ini harus positif.

[in] Wait

Menentukan apakah panggilan ke KeReleaseSemaphore akan segera diikuti dengan panggilan ke salah satu rutinitas KeWaitXxx . Jika TRUE, panggilan KeReleaseSemaphore harus diikuti dengan panggilan ke KeWaitForMultipleObjects, KeWaitForMutexObject, atau KeWaitForSingleObject. Untuk informasi selengkapnya, lihat bagian Keterangan berikut ini.

Nilai kembali

Jika nilai yang dikembalikan adalah nol, status objek semaphore sebelumnya tidak diberi sinyal.

Keterangan

KeReleaseSemaphore menyediakan peningkatan prioritas run-time untuk alur tunggu. Jika panggilan ini mengatur semaphore ke status yang disinyalir, jumlah semaphore akan bertambah oleh nilai yang ditentukan. Pemanggil juga dapat menentukan apakah akan memanggil salah satu rutinitas KeWaitXxx segera setelah KeReleaseSemaphore mengembalikan kontrol.

Merilis objek semaphore menyebabkan jumlah semaphore bertambah dengan nilai parameter Penyesuaian . Jika nilai yang dihasilkan lebih besar dari batas objek semaphore, hitungan tidak disesuaikan dan pengecualian, STATUS_SEMAPHORE_LIMIT_EXCEEDED, dinaikkan.

Menambah jumlah objek semaphore menyebabkan semaphore mencapai keadaan bersinyali, dan upaya dilakukan untuk memenuhi sebanyak mungkin menunggu pada objek semaphore.

Rutinitas KeReleaseSemaphore mungkin untuk sementara meningkatkan IRQL. Jika parameter WaitFALSE, rutinitas, sebelum kembali, memulihkan IRQL ke nilai asli yang dimilikinya di awal panggilan.

Jika Wait = TRUE, rutinitas akan kembali tanpa menurunkan IRQL. Dalam hal ini, panggilan KeReleaseSemaphore harus segera diikuti oleh panggilan KeWaitXxx . Dengan mengatur Wait = TRUE, penelepon dapat mencegah peralihan konteks yang tidak perlu terjadi antara panggilan KeReleaseSemaphore dan panggilan KeWaitXxx . Rutinitas KeWaitXxx , sebelum kembali, memulihkan IRQL ke nilai aslinya di awal panggilan KeReleaseSemaphore . Meskipun IRQL menonaktifkan peralihan konteks antara dua panggilan, panggilan ini tidak dapat digunakan dengan andal sebagai awal dan akhir operasi atomik. Misalnya, di antara kedua panggilan ini, utas yang berjalan pada saat yang sama pada prosesor lain dapat mengubah status objek semaphore atau target tunggu.

Peringatan

Utas yang dapat dipaginasi atau rutinitas driver yang dapat di-pageable yang berjalan di IRQL = PASSIVE_LEVEL tidak boleh memanggil KeReleaseSemaphore dengan parameter Tunggu diatur ke TRUE. Panggilan seperti itu menyebabkan kesalahan halaman fatal jika fungsi panggilan kebetulan di-paged antara panggilan ke KeReleaseSemaphore dan KeWaitXxx.

Untuk informasi selengkapnya tentang objek semaphore, lihat Objek Semaphore.

Penelepon KeReleaseSemaphore harus berjalan di IRQL <= DISPATCH_LEVEL asalkan Tunggu diatur ke FALSE. Jika tidak, pemanggil harus berjalan di IRQL = PASSIVE_LEVEL.

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Tersedia dimulai dengan Windows 2000.
Target Platform Universal
Header wdm.h (termasuk Wdm.h, Ntddk.h, Ntifs.h)
Pustaka NtosKrnl.lib
DLL NtosKrnl.exe
IRQL Lihat bagian Keterangan.
Aturan kepatuhan DDI HwStorPortProhibitedDDIs(storport)

Lihat juga

KeInitializeSemaphore

KeReadStateSemaphore

KeWaitForMultipleObjects

KeWaitForsingleObject