Apa itu kumpulan utas?


62

Bagaimana cara menerapkan threadpool? Saya telah membaca di wikipedia untuk "threadpool" tapi saya masih belum bisa mencari tahu apa yang harus dilakukan untuk menyelesaikan pertanyaan ini (mungkin karena saya tidak begitu mengerti apa itu threadpool dalam istilah sederhana).

Dapatkah seseorang menjelaskan kepada saya dalam bahasa Inggris yang sederhana apa itu threadpool dan bagaimana seseorang menjawab pertanyaan ini?

Jawaban:


96

Kumpulan utas adalah sekelompok utas pra-instantiated, yang siap untuk diberikan pekerjaan. Ini lebih disukai daripada instantiating utas baru untuk setiap tugas ketika ada sejumlah besar tugas pendek yang harus dilakukan daripada sejumlah kecil yang panjang. Ini mencegah keharusan mengeluarkan overhead untuk membuat utas dalam jumlah besar.

Implementasi akan bervariasi menurut lingkungan, tetapi dalam istilah yang disederhanakan, Anda memerlukan yang berikut:

  • Cara untuk membuat utas dan menahannya dalam status siaga. Hal ini dapat dicapai dengan meminta setiap utas menunggu di penghalang sampai pool berfungsi. (Ini bisa dilakukan dengan mutex juga.)
  • Wadah untuk menyimpan utas yang dibuat, seperti antrian atau struktur lain yang memiliki cara untuk menambahkan utas ke kolam dan menarik keluar.
  • Antarmuka standar atau kelas abstrak untuk digunakan utas dalam melakukan pekerjaan. Ini mungkin kelas abstrak yang disebut Taskdengan execute()metode yang melakukan pekerjaan dan kemudian kembali.

Ketika kumpulan thread dibuat, ia akan membuat sejumlah utas untuk menyediakan atau membuat yang baru sesuai kebutuhan tergantung pada kebutuhan implementasi.

Ketika kolam diberikan a Task, dibutuhkan seutas benang dari wadah (atau menunggu satu tersedia jika wadah itu kosong), menyerahkannya Task, dan memenuhi penghalang. Hal ini menyebabkan utas menganggur untuk melanjutkan eksekusi, menggunakan execute()metode Taskyang diberikannya. Setelah eksekusi selesai, utas tangan itu sendiri kembali ke kolam untuk dimasukkan ke dalam wadah untuk digunakan kembali dan kemudian memenuhi penghalang, menempatkan dirinya untuk tidur sampai siklus berulang.


19
Kumpulan utas adalah grup utas pra-instantiated, yang siap untuk diberikan pekerjaan. [...] Ini mencegah Anda harus mengeluarkan biaya terlalu banyak untuk membuat utas. - ini harus diludahi oleh Google setiap kali seseorang mencari "kumpulan utas"
Rafael Eyng

Apakah pembuatan thread pool melibatkan penghalang secara internal? Bisakah Anda berbagi referensi, di baris ini?
pertukaran berlebihan

@ overexchange Tidak, tidak. Referensi saya untuk pertanyaan ini adalah sebagai contoh cara yang lebih baik untuk menulis ulang pertanyaan penghalang Anda . (Jika Anda melakukannya, saya akan menulis jawaban.)
Blrfl

salah satu jawaban pendek terbaik.
Blood-HaZaRd

10

Thread pool adalah kumpulan dari thread yang dikelola yang biasanya diatur dalam antrian, yang menjalankan tugas dalam antrian tugas.

Membuat objek utas baru setiap kali Anda perlu sesuatu untuk dieksekusi secara sinkron itu mahal. Di kumpulan utas Anda hanya akan menambahkan tugas yang ingin Anda jalankan secara asinkron ke antrian tugas dan kumpulan utas menangani menetapkan utas yang tersedia, jika ada, untuk tugas yang sesuai. Segera setelah tugas selesai, utas yang sekarang tersedia meminta tugas lain (dengan asumsi masih ada).

Kolam utas membantu Anda menghindari membuat atau menghancurkan lebih banyak utas, daripada yang sebenarnya diperlukan.

Saya akan mulai dengan membuat kelas dengan antrian utas dan antrian tugas. Kemudian mengimplementasikan metode yang menambahkan tugas ke antrian tugas dan beralih dari sana. Jelas, Anda juga harus memungkinkan untuk mengatur utas maksimum yang dibolehkan dalam kumpulan utas.


1

Dalam aplikasi multithreaded, kumpulan utas adalah "kumpulan utas yang tersedia" yang dapat digunakan oleh aplikasi Anda. Biasanya, misalnya. NET, semuanya dikelola sehingga Anda hanya menetapkan tugas dan sekali utas gratis, ia akan melakukannya. Jadi untuk mengimplementasikan threadpool, saya berharap untuk membuat konsep di mana tugas-tugas secara otomatis diambil oleh utas bebas tanpa pembuatan utas eksplisit untuk setiap tugas.


1

Contoh Kehidupan Nyata;

  1. Fasilitas: Sistem operasi
  2. Bagian: Aplikasi
  3. Orang-orang: Utas

Anda memiliki fasilitas di sana 12 orang bekerja. Ada 3 bagian dari fasilitas ini. Dapur, toilet, dan keamanan. Jika Anda tidak menggunakan teknik thread pool, begitulah cara kerjanya: Ke-12 orang akan berdiri di ruang rapat, jika pelanggan baru datang dengan fasilitas dan meminta tugas, maka Anda akan memisahkan orang dalam kelompok dan mengirim mereka untuk melakukan pekerjaan mereka , dan kembali ke ruang rapat. Tapi, sebelum mereka pergi ke tugas mereka, ada fase persiapan. Mereka perlu mengenakan seragam yang benar, melengkapi perangkat tertentu dan berjalan ke bagian itu, menyelesaikan pekerjaan dan kembali. Jadi, sekali setiap kali mereka menyelesaikan pekerjaan mereka (benang berakhir), mereka harus berjalan kembali ke ruang pertemuan, membuka pakaian seragam, mengambil peralatan dan menunggu pekerjaan berikutnya. Ini merujuk pada menciptakan konteks utas, ini adalah alokasi memori dan informasi pelacakan oleh OS.

Jika Anda menggunakan thread pooling, maka, di pagi hari, Anda akan menugaskan 6 orang ke dapur, 2 orang ke kamar kecil dan 4 orang ke keamanan. Jadi, mereka hanya akan melakukan persiapan sekali sehari. Bahkan jika tidak ada pelanggan di dapur, 4 orang itu akan ada di sana, menganggur, untuk setiap tugas mendatang. Mereka tidak perlu kembali ke ruang rapat sampai dapur ditutup (aplikasi berakhir). Keempat orang ini berada di kumpulan aplikasi Dapur, dan siap melayani dengan cepat. Tetapi, Anda tidak dapat berjanji bahwa mereka bekerja sepanjang hari, karena dapur dapat menjadi waktu menganggur dari waktu ke waktu. Logika yang sama berlaku untuk toilet dan keamanan juga.

Dalam skenario pertama, Anda tidak menyia-nyiakan utas untuk tugas apa pun, TETAPI akan membutuhkan banyak waktu untuk mempersiapkan setiap utas untuk setiap tugas. Di yang kedua, Anda menyiapkan utas sebelumnya, jadi Anda tidak dapat menjamin Anda akan menggunakan semua utas untuk semua tugas, tetapi, sebagian besar OS membuat optimasi yang hebat di atasnya, sehingga Anda dapat dengan aman mengandalkannya.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.