Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Membuat utas untuk dijalankan dalam ruang alamat virtual proses panggilan.
Untuk membuat utas yang berjalan di ruang alamat virtual proses lain, gunakan fungsi
Sintaksis
HANDLE CreateThread(
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] SIZE_T dwStackSize,
[in] LPTHREAD_START_ROUTINE lpStartAddress,
[in, optional] __drv_aliasesMem LPVOID lpParameter,
[in] DWORD dwCreationFlags,
[out, optional] LPDWORD lpThreadId
);
Parameter
[in, optional] lpThreadAttributes
Penunjuk ke struktur SECURITY_ATTRIBUTES yang menentukan deskriptor keamanan untuk utas baru dan menentukan apakah proses turunan dapat mewarisi handel yang dikembalikan. Jika lpThreadAttributes adalah NULL, utas mendapatkan deskriptor keamanan default dan handel tidak dapat diwariskan. Daftar kontrol akses (ACL) dalam deskriptor keamanan default untuk utas berasal dari token utama pembuat.
[in] dwStackSize
Ukuran awal tumpukan, dalam byte. Sistem membulatkan nilai ini ke halaman terdekat. Jika parameter ini nol, utas baru menggunakan ukuran default untuk yang dapat dieksekusi. Untuk informasi selengkapnya, lihat Ukuran Tumpukan Utas.
[in] lpStartAddress
Penunjuk ke fungsi yang ditentukan aplikasi yang akan dijalankan oleh utas. Penunjuk ini mewakili alamat awal utas. Untuk informasi selengkapnya tentang fungsi utas, lihat ThreadProc.
[in, optional] lpParameter
Penunjuk ke variabel yang akan diteruskan ke utas.
[in] dwCreationFlags
Bendera yang mengontrol pembuatan utas.
[out, optional] lpThreadId
Penunjuk ke variabel yang menerima pengidentifikasi utas. Jika parameter ini null, pengidentifikasi utas tidak dikembalikan.
Mengembalikan nilai
Jika fungsi berhasil, nilai pengembalian adalah handel ke utas baru.
Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, panggil GetLastError.
Perhatikan bahwa CreateThread dapat berhasil meskipun lpStartAddress menunjuk ke data, kode, atau tidak dapat diakses. Jika alamat mulai tidak valid saat utas berjalan, pengecualian terjadi, dan utas berakhir. Penghentian utas karena alamat mulai yang tidak valid ditangani sebagai keluar kesalahan untuk proses utas. Perilaku ini mirip dengan sifat asinkron CreateProcess, tempat proses dibuat bahkan jika mengacu pada pustaka tautan dinamis (DLL) yang tidak valid atau hilang.
Komentar
Jumlah utas yang dapat dibuat proses dibatasi oleh memori virtual yang tersedia. Secara default, setiap utas memiliki satu megabyte ruang tumpukan. Oleh karena itu, Anda tidak dapat membuat 2.048 utas atau lebih pada sistem 32-bit tanpa opsi /3GB boot.ini. Jika Anda mengurangi ukuran tumpukan default, Anda dapat membuat lebih banyak utas. Namun, aplikasi Anda akan memiliki performa yang lebih baik jika Anda membuat satu utas per prosesor dan membangun antrean permintaan yang aplikasinya mempertahankan informasi konteks. Utas akan memproses semua permintaan dalam antrean sebelum memproses permintaan dalam antrean berikutnya.
Handel utas baru dibuat dengan hak akses THREAD_ALL_ACCESS. Jika deskriptor keamanan tidak disediakan saat utas dibuat, deskriptor keamanan default dibangun untuk utas baru menggunakan token utama proses yang membuat utas. Ketika penelepon mencoba mengakses utas dengan fungsi OpenThread
Utas yang baru dibuat memiliki hak akses penuh untuk dirinya sendiri saat memanggil fungsi
Windows Server 2003: Hak akses utas untuk dirinya sendiri dihitung dengan mengevaluasi token utama proses di mana utas dibuat terhadap deskriptor keamanan default yang dibangun untuk utas. Jika utas dibuat dalam proses jarak jauh, token utama dari proses jarak jauh digunakan. Akibatnya, utas yang baru dibuat mungkin telah mengurangi hak akses ke dirinya sendiri saat memanggil GetCurrentThread. Beberapa hak akses termasuk THREAD_SET_THREAD_TOKEN dan THREAD_GET_CONTEXT mungkin tidak ada, yang menyebabkan kegagalan tak terduga. Untuk alasan ini, membuat utas sambil meniru pengguna lain tidak disarankan.
Jika utas dibuat dalam status yang dapat dijalankan (yaitu, jika bendera CREATE_SUSPENDED tidak digunakan), utas dapat mulai berjalan sebelum CreateThread kembali dan, khususnya, sebelum pemanggil menerima handel dan pengidentifikasi utas yang dibuat.
Eksekusi utas dimulai pada fungsi yang ditentukan oleh parameter lpStartAddress
Utas dibuat dengan prioritas utas THREAD_PRIORITY_NORMAL. Gunakan fungsi GetThreadPriority dan SetThreadPriority untuk mendapatkan dan menetapkan nilai prioritas utas.
Ketika utas berakhir, objek utas mencapai status yang disinyalir, memenuhi utas apa pun yang menunggu pada objek.
Objek utas tetap berada dalam sistem sampai utas dihentikan dan semua handel untuk itu telah ditutup melalui panggilan ke CloseHandle.
ExitProcess, ExitThread, CreateThread, fungsi CreateRemoteThread, dan proses yang dimulai (sebagai hasil dari panggilan oleh CreateProcess) diserialisasikan antara satu sama lain dalam proses. Hanya salah satu peristiwa ini yang dapat terjadi di ruang alamat pada satu waktu. Ini berarti bahwa pembatasan berikut menyimpan:
- Selama rutinitas startup proses dan inisialisasi DLL, utas baru dapat dibuat, tetapi tidak memulai eksekusi sampai inisialisasi DLL dilakukan untuk proses tersebut.
- Hanya satu utas dalam proses yang dapat berada dalam inisialisasi DLL atau melepaskan rutinitas pada satu waktu.
- ExitProcess tidak selesai sampai tidak ada utas dalam inisialisasi DLL atau melepaskan rutinitas.
Windows Phone 8.1: Fungsi ini didukung untuk aplikasi Windows Phone Store di Windows Phone 8.1 dan yang lebih baru.
windows 8.1 dan Windows Server 2012 R2: Fungsi ini didukung untuk aplikasi Windows Store pada Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Contoh
Misalnya, lihat Membuat Utas.
Persyaratan
| Syarat | Nilai |
|---|---|
| klien minimum yang didukung | Windows XP [aplikasi desktop | Aplikasi UWP] |
| server minimum yang didukung |
Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
| Platform Target |
Windows |
| Header |
processthreadsapi.h (termasuk Windows.h pada Windows Server 2003, Windows Vista, Windows 7, Windows Server 2008 Windows Server 2008 R2) |
| Pustaka |
Kernel32.lib; WindowsPhoneCore.lib di Windows Phone 8.1 |
| DLL |
Kernel32.dll; KernelBase.dll di Windows Phone 8.1 |
Lihat juga
ExitProcess
ExitThread
GetThreadPriority
setThreadPriority
Utas