Bagikan melalui


Apartemen Multithreaded

Dalam model apartemen multithreaded, semua utas dalam proses yang telah diinisialisasi sebagai utas bebas berada di satu apartemen. Oleh karena itu, tidak perlu marshal antar utas. Utas tidak perlu mengambil dan mengirimkan pesan karena COM tidak menggunakan pesan jendela dalam model ini.

Panggilan ke metode objek di apartemen multithreaded dapat dijalankan pada utas apa pun di apartemen. Tidak ada serialisasi panggilan; banyak panggilan dapat terjadi pada metode yang sama atau ke objek yang sama secara bersamaan. Objek yang dibuat di apartemen multithreaded harus dapat menangani panggilan pada metode mereka dari utas lain kapan saja.

Karena panggilan ke objek tidak diserialisasikan dengan cara apa pun, konkurensi objek multithread menawarkan performa tertinggi dan mengambil keuntungan terbaik dari perangkat keras multiprosesor untuk panggilan lintas alur, lintas proses, dan lintas mesin. Namun, ini berarti bahwa kode untuk objek harus memberikan sinkronisasi dalam implementasi antarmuka mereka, biasanya melalui penggunaan primitif sinkronisasi seperti objek peristiwa, bagian penting, mutex, atau semaphores, yang dijelaskan nanti di bagian ini. Selain itu, karena objek tidak mengontrol masa pakai utas yang mengaksesnya, tidak ada status khusus utas yang dapat disimpan dalam objek (dalam penyimpanan lokal utas).

Berikut adalah beberapa pertimbangan penting mengenai sinkronisasi untuk apartemen multithreaded:

  • COM menyediakan sinkronisasi panggilan hanya untuk apartemen berulir tunggal.
  • Apartemen multithread tidak menerima panggilan saat melakukan panggilan (pada utas yang sama).
  • Apartemen multithreaded tidak dapat melakukan panggilan input yang disinkronkan.
  • Panggilan asinkron dikonversi ke panggilan sinkron di apartemen multithreaded.
  • Filter pesan tidak dipanggil untuk utas apa pun di apartemen multithreaded.

Untuk menginisialisasi utas sebagai utas bebas, panggil CoInitializeEx, yang menentukan COINIT_MULTITHREADED. Untuk informasi tentang utas server dalam proses, lihat Masalah Utas Server Dalam Proses.

Beberapa klien dapat secara bersamaan memanggil, dari utas yang berbeda, objek yang mendukung utas bebas. Di server out-of-process berulir bebas, COM, melalui subsistem RPC, membuat kumpulan utas dalam proses server dan panggilan klien (atau beberapa panggilan klien) dapat dikirimkan oleh salah satu utas ini kapan saja. Server di luar proses juga harus menerapkan sinkronisasi di pabrik kelasnya. Objek berulir bebas dalam proses dapat menerima panggilan langsung dari beberapa utas klien.

Klien dapat melakukan pekerjaan COM di beberapa utas. Semua utas milik apartemen multithread yang sama. Penunjuk antarmuka diteruskan langsung dari utas ke utas dalam apartemen multithreaded, sehingga pointer antarmuka tidak dinaikkan di antara utasnya. Filter pesan (implementasi IMessageFilter) tidak digunakan di apartemen multithreaded. Utas klien akan ditangguhkan ketika melakukan panggilan COM ke objek di luar apartemen dan akan dilanjutkan ketika panggilan kembali. Panggilan antar proses masih ditangani oleh RPC.

Utas yang diinisialisasi dengan model utas bebas harus menerapkan sinkronisasi mereka sendiri. Seperti disebutkan sebelumnya di bagian ini, Windows memungkinkan implementasi ini melalui primitif sinkronisasi berikut:

  • Objek peristiwa menyediakan cara memberi sinyal satu atau beberapa utas bahwa suatu peristiwa telah terjadi. Utas apa pun dalam proses dapat membuat objek peristiwa. Handel ke peristiwa dikembalikan oleh fungsi pembuatan peristiwa, CreateEvent. Setelah objek peristiwa dibuat, utas dengan handel ke objek dapat menunggu di atasnya sebelum melanjutkan eksekusi.
  • Bagian penting digunakan untuk bagian kode yang memerlukan akses eksklusif ke beberapa set data bersama sebelum dapat dijalankan dan hanya digunakan oleh utas dalam satu proses. Bagian penting seperti turnstile di mana hanya satu utas pada satu waktu yang dapat berlalu, bekerja sebagai berikut:
  • Mutex melakukan fungsi yang sama dengan bagian penting, kecuali bahwa mutex dapat diakses oleh utas yang berjalan dalam proses yang berbeda. Memiliki objek mutex seperti memiliki lantai dalam perdebatan. Proses membuat objek mutex dengan memanggil fungsi CreateMutex , yang mengembalikan handel. Utas pertama yang meminta objek mutex mendapatkan kepemilikannya. Ketika utas telah selesai dengan mutex, kepemilikan diteruskan ke utas lain berdasarkan yang pertama datang dan dilayani pertama kali.
  • Semaphores digunakan untuk mempertahankan jumlah referensi pada beberapa sumber daya yang tersedia. Utas membuat semaphore untuk sumber daya dengan memanggil fungsi CreateSemaphore dan meneruskan penunjuk ke sumber daya, jumlah sumber daya awal, dan jumlah sumber daya maksimum. Fungsi ini mengembalikan handel. Utas yang meminta sumber daya melewati handel semaphore-nya dalam panggilan ke fungsi WaitForSingleObject. Objek semaphore melakukan polling sumber daya untuk menentukan apakah tersedia. Jika demikian, semaphore mengurangi jumlah sumber daya dan membangunkan utas tunggu. Jika jumlahnya nol, utas tetap tertidur hingga utas lain merilis sumber daya, yang menyebabkan semaphore menaikkan hitungan menjadi satu.

Mengakses Antarmuka Di Seluruh Apartemen

Memilih Model Threading

Masalah Utas Server Dalam Proses

Proses, Utas, dan Apartemen

Komunikasi Berutas Tunggal dan Multithreaded

Apartemen Single-Threaded