Bagikan melalui


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
0
Utas berjalan segera setelah pembuatan.
CREATE_SUSPENDED
0x00000004
Utas dibuat dalam status ditangguhkan, dan tidak berjalan hingga fungsi ResumeThread dipanggil.
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
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.
Utas dalam executable yang memanggil pustaka run-time C (CRT) harus menggunakan fungsi _beginthreadex dan _endthreadex untuk manajemen utas daripada CreateThread dan ExitThread; ini memerlukan penggunaan versi CRT multithreaded. Jika utas yang dibuat menggunakan CreateThread memanggil CRT, CRT dapat mengakhiri proses dalam kondisi memori rendah.

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

Lihat juga

CloseHandle

CreateProcess

CreateRemoteThread

ExitProcess

ExitThread

GetExitCodeThread

GetThreadPriority

Fungsi Proses dan Utas

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority

SuspendThread

ThreadProc

Threads