Bagikan melalui


Mengelola Referensi Utas

Artikel ini berisi informasi tentang pengelolaan referensi utas menggunakan fungsi dari fungsi utilitas ringan Shell.

Situasi muncul ketika utas induk harus terus aktif selama masa hidup utas anak. Misalnya, jika objek Model Objek Komponen (COM) dibuat pada thread induk dan dialihkan ke thread anak, thread induk tersebut tidak dapat berhenti sebelum thread anak. Untuk mencapai hal ini, Shell menyediakan fungsi-fungsi ini.

Gunakan fungsi-fungsi ini di utas induk Anda seperti yang diuraikan di sini.

  1. Deklarasikan prosedur utas yang ditentukan aplikasi dengan mengikuti bentuk fungsi ThreadProc.

    DWORD WINAPI ThreadProc(LPVOID lpParameter);
    
  2. DiThreadProcAnda, panggil SHCreateThreadRef untuk membuat referensi ke utas. Ini menyediakan pointer ke instans IUnknown. IUnknown ini menggunakan nilai yang ditunjukkan oleh pcRef untuk mempertahankan jumlah referensi. Selama jumlah ini lebih besar dari 0, utas tetap aktif.

  3. Menggunakan pointer tersebut untuk IUnknown, panggil SHSetThreadRef dalam ThreadProc Anda. Ini mengatur referensi sehingga panggilan berikutnya ke SHGetThreadRef memiliki sesuatu untuk diambil.

  4. Jika ThreadProc Anda membuat utas lain, utas tersebut (ThreadProc) dapat memanggil SHGetThreadRef dengan pointer ke IUnknown yang diperoleh melalui SHCreateThreadRef. Ini meningkatkan jumlah referensi yang ditunjukkan oleh parameter pcRef di SHCreateThreadRef.

  5. Buat utas. Ini biasanya dilakukan dengan memanggilSHCreateThread , meneruskan pointer keThreadProcAnda di parameter pfnThreadProc. Teruskan juga flag CTF_THREAD_REF di parameter dwFlags. Utas aktif selama ThreadProc dijalankan.

  6. Saat utas anak dibuat, berikan bendera CTF_REF_COUNTED pada parameter dwFlags dalam pemanggilan ke SHCreateThread.

  7. Saat thread anak selesai dan dirilis, nilai yang ditunjuk oleh thread induk pcRef menurun. Setelah semua utas anak selesai, ThreadProc asli dapat menyelesaikan dan merilis referensi utas terakhir, sehingga jumlah referensi berkurang menjadi 0. Pada saat itu, referensi ke utas asli yang dibuka oleh SHCreateThread dirilis dan utas selesai.

Fungsi terkait lainnya adalah SHReleaseThreadRef. Fungsi ini dipanggil oleh ThreadProc jika utas telah dibuat menggunakan SHCreateThread dengan flag CTF_THREAD_REF. Namun, ThreadProc tidak diperlukan untuk melakukannya secara implisit. Memanggil IUnknown::Release pada pointer untuk IUnknown yang diperoleh melalui SHCreateThreadRef adalah semua yang perlu dilakukan.