Fungsi CreateThread (processthreadsapi.h)
Membuat utas untuk dijalankan dalam ruang alamat virtual dari proses panggilan.
Untuk membuat utas yang berjalan di ruang alamat virtual proses lain, gunakan fungsi CreateRemoteThread .
Sintaks
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 apakah handel yang dikembalikan dapat diwariskan oleh proses anak. Jika lpThreadAttributes adalah NULL, handel tidak dapat diwariskan.
Anggota lpSecurityDescriptor dari struktur menentukan deskriptor keamanan untuk utas baru. Jika lpThreadAttributes adalah NULL, utas akan mendapatkan pendeskripsi keamanan default. 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.
Nilai | Makna |
---|---|
|
Utas berjalan segera setelah pembuatan. |
|
Utas dibuat dalam status ditangguhkan, dan tidak berjalan hingga fungsi ResumeThread dipanggil. |
|
Parameter dwStackSize menentukan ukuran cadangan awal tumpukan. Jika bendera ini tidak ditentukan, dwStackSize menentukan ukuran penerapan. |
[out, optional] lpThreadId
Penunjuk ke variabel yang menerima pengidentifikasi utas. Jika parameter ini NULL, pengidentifikasi utas tidak dikembalikan.
Nilai kembali
Jika fungsi berhasil, nilai yang dikembalikan adalah handel ke utas baru.
Jika fungsi gagal, nilai yang dikembalikan adalah NULL. Untuk mendapatkan informasi kesalahan yang diperluas, hubungi GetLastError.
Perhatikan bahwa CreateThread mungkin berhasil meskipun lpStartAddress menunjuk ke data, kode, atau tidak dapat diakses. Jika alamat awal tidak valid saat utas berjalan, pengecualian terjadi, dan utas berakhir. Penghentian utas karena alamat mulai yang tidak valid ditangani sebagai keluarnya kesalahan untuk proses utas. Perilaku ini mirip dengan sifat asinkron CreateProcess, di mana proses dibuat bahkan jika mengacu pada pustaka tautan dinamis (DLL) yang tidak valid atau hilang.
Keterangan
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 /3GB
opsi 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 , token efektif pemanggil dievaluasi terhadap pendeskripsi keamanan ini untuk memberikan atau menolak akses.
Utas yang baru dibuat memiliki hak akses penuh untuk dirinya sendiri saat memanggil fungsi GetCurrentThread .
Windows Server 2003: Hak akses utas ke 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 yang tidak terduga. Untuk alasan ini, membuat utas saat meniru pengguna lain tidak disarankan.
Jika utas dibuat dalam status dapat dijalankan (yaitu, jika bendera CREATE_SUSPENDED tidak digunakan), utas dapat mulai berjalan sebelum CreateThread mengembalikan dan, khususnya, sebelum pemanggil menerima handel dan pengidentifikasi utas yang dibuat.
Eksekusi utas dimulai pada fungsi yang ditentukan oleh parameter lpStartAddress . Jika fungsi ini kembali, nilai pengembalian DWORD digunakan untuk mengakhiri utas dalam panggilan implisit ke fungsi ExitThread . Gunakan fungsi GetExitCodeThread untuk mendapatkan nilai pengembalian utas.
Utas dibuat dengan prioritas utas THREAD_PRIORITY_NORMAL. Gunakan fungsi GetThreadPriority dan SetThreadPriority untuk mendapatkan dan mengatur nilai prioritas utas.
Ketika utas berakhir, objek utas mencapai status yang disinyalkan, memenuhi utas apa pun yang menunggu pada objek.
Objek utas tetap berada dalam sistem sampai utas dihentikan dan semua handel ke dalamnya telah ditutup melalui panggilan ke CloseHandle.
Fungsi ExitProcess, ExitThread, CreateThread, 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 berlaku:
- 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 mereka 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 di Windows 8.1, Windows Server 2012 R2, dan yang lebih baru.
Contoh
Misalnya, lihat Membuat Utas.
Persyaratan
Persyaratan | Nilai |
---|---|
Klien minimum yang didukung | Windows XP [aplikasi desktop | Aplikasi UWP] |
Server minimum yang didukung | Windows Server 2003 [aplikasi desktop | Aplikasi UWP] |
Target Platform | 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 pada Windows Phone 8.1 |