Manufaktur industri
Industri Internet of Things | bahan industri | Pemeliharaan dan Perbaikan Peralatan | Pemrograman industri |
home  MfgRobots >> Manufaktur industri >  >> Industrial programming >> Bahasa C

C# - Multithreading

Sebuah utas didefinisikan sebagai jalur eksekusi suatu program. Setiap utas mendefinisikan aliran kontrol yang unik. Jika aplikasi Anda melibatkan operasi yang rumit dan memakan waktu, maka sering kali membantu untuk menetapkan jalur atau utas eksekusi yang berbeda, dengan setiap utas melakukan tugas tertentu.

Utas adalah proses ringan . Salah satu contoh umum penggunaan thread adalah implementasi pemrograman konkuren oleh sistem operasi modern. Penggunaan utas menghemat pemborosan siklus CPU dan meningkatkan efisiensi aplikasi.

Sejauh ini kami menulis program di mana satu utas berjalan sebagai satu proses yang merupakan contoh aplikasi yang sedang berjalan. Namun, dengan cara ini aplikasi dapat melakukan satu pekerjaan pada satu waktu. Untuk membuatnya menjalankan lebih dari satu tugas pada satu waktu, itu dapat dibagi menjadi utas yang lebih kecil.

Siklus Hidup Benang

Siklus hidup utas dimulai ketika objek dari kelas System.Threading.Thread dibuat dan berakhir ketika utas dihentikan atau menyelesaikan eksekusi.

Berikut ini adalah berbagai status dalam siklus hidup sebuah thread

Utas Utama

Dalam C#, System.Threading.Thread class digunakan untuk bekerja dengan utas. Hal ini memungkinkan membuat dan mengakses utas individu dalam aplikasi multithreaded. Thread pertama yang dieksekusi dalam suatu proses disebut main utas.

Ketika program C# memulai eksekusi, utas utama dibuat secara otomatis. Utas dibuat menggunakan Utas kelas disebut utas anak dari utas utama. Anda dapat mengakses utas menggunakan CurrentThread milik kelas Thread.

Program berikut mendemonstrasikan eksekusi thread utama

Demo Langsung
using System;
using System.Threading;

namespace MultithreadingApplication {
   class MainThreadProgram {
      static void Main(string[] args) {
         Thread th = Thread.CurrentThread;
         th.Name = "MainThread";
         
         Console.WriteLine("This is {0}", th.Name);
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut

This is MainThread

Properti dan Metode Kelas Thread

Tabel berikut menunjukkan beberapa properti yang paling umum digunakan dari Utas kelas

No.Sr. Properti &Deskripsi
1

Konteks Saat Ini

Mendapatkan konteks saat ini di mana utas dijalankan.

2

Budaya Saat Ini

Mendapatkan atau menyetel budaya untuk utas saat ini.

3

Prinsip Saat Ini

Mendapatkan atau menetapkan prinsip thread saat ini (untuk keamanan berbasis peran).

4

Utas Saat Ini

Mendapatkan utas yang sedang berjalan.

5

BudayaUIC Saat Ini

Mendapatkan atau menyetel budaya saat ini yang digunakan oleh Resource Manager untuk mencari sumber daya khusus budaya saat run-time.

6

Konteks Eksekusi

Mendapatkan objek ExecutionContext yang berisi informasi tentang berbagai konteks utas saat ini.

7

IsAlive

Mendapat nilai yang menunjukkan status eksekusi utas saat ini.

8

IsBackground

Mendapatkan atau menetapkan nilai yang menunjukkan apakah suatu utas adalah utas latar belakang atau bukan.

9

IsThreadPoolThread

Mendapatkan nilai yang menunjukkan apakah sebuah thread termasuk dalam kumpulan thread yang dikelola atau tidak.

10

ManagedThreadId

Mendapatkan pengidentifikasi unik untuk utas terkelola saat ini.

11

Nama

Mendapatkan atau menetapkan nama utas.

12

Prioritas

Mendapatkan atau menetapkan nilai yang menunjukkan prioritas penjadwalan utas.

13

Keadaan Utas

Mendapat nilai yang berisi status utas saat ini.

Tabel berikut menunjukkan beberapa metode yang paling umum digunakan dari Utas kelas

No.Sr. Metode &Deskripsi
1

kekosongan publik Abort()

Menaikkan ThreadAbortException di utas tempat ia dipanggil, untuk memulai proses penghentian utas. Memanggil metode ini biasanya mengakhiri utas.

2

LocalDataStoreSlot statis publik AllocateDataSlot()

Mengalokasikan slot data yang tidak disebutkan namanya pada semua utas. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

3

LocalDataStoreSlot statis publik AllocateNamedDataSlot(nama string)

Mengalokasikan slot data bernama pada semua utas. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

4

kekosongan statis publik BeginCriticalRegion()

Memberi tahu host bahwa eksekusi akan memasuki wilayah kode di mana efek pembatalan thread atau pengecualian yang tidak tertangani dapat membahayakan tugas lain dalam domain aplikasi.

5

kekosongan statis publik BeginThreadAffinity()

Memberi tahu host bahwa kode terkelola akan menjalankan instruksi yang bergantung pada identitas utas sistem operasi fisik saat ini.

6

kekosongan statis publik EndCriticalRegion()

Memberi tahu host bahwa eksekusi akan memasuki wilayah kode di mana efek dari thread yang dibatalkan atau pengecualian yang tidak tertangani terbatas pada tugas saat ini.

7

kekosongan statis publik EndThreadAffinity()

Memberi tahu host bahwa kode terkelola telah selesai mengeksekusi instruksi yang bergantung pada identitas utas sistem operasi fisik saat ini.

8

kekosongan statis publik FreeNamedDataSlot(nama string)

Menghilangkan asosiasi antara nama dan slot, untuk semua utas dalam proses. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

9

GetData Obyek statis publik (slot LocalDataStoreSlot)

Mengambil nilai dari slot yang ditentukan pada utas saat ini, dalam domain utas saat ini. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

10

AppDomain statis publik GetDomain()

Mengembalikan domain saat ini di mana utas saat ini berjalan.

11

Publik AppDomain GetDomainID()

Mengembalikan pengenal domain aplikasi unik

12

LokalDataStoreSlot statis publik GetNamedDataSlot(nama string)

Mencari slot data bernama. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

13

Interupsi kekosongan publik()

Menginterupsi utas yang ada dalam status utas WaitSleepJoin.

14

public void Join()

Memblokir utas panggilan hingga utas berakhir, sambil terus melakukan pemompaan COM dan SendMessage standar. Metode ini memiliki bentuk kelebihan beban yang berbeda.

15

public static void MemoryBarrier()

Menyinkronkan akses memori sebagai berikut:Prosesor yang mengeksekusi utas saat ini tidak dapat menyusun ulang instruksi sedemikian rupa sehingga akses memori sebelum panggilan ke MemoryBarrier dieksekusi setelah akses memori yang mengikuti panggilan ke MemoryBarrier.

16

kekosongan statis publik ResetAbort()

Membatalkan permintaan Abort untuk utas saat ini.

17

Publik static void SetData(slot LocalDataStoreSlot, Data objek)

Menetapkan data di slot yang ditentukan pada utas yang sedang berjalan, untuk domain utas saat ini. Untuk kinerja yang lebih baik, gunakan bidang yang ditandai dengan atribut ThreadStaticAttribute sebagai gantinya.

18

kekosongan publik Mulai()

Memulai utas.

19

public static void Sleep(int millisecondsTimeout)

Membuat utas berhenti untuk jangka waktu tertentu.

20

public static void SpinWait(int iterasi)

Menyebabkan utas menunggu beberapa kali yang ditentukan oleh parameter iterasi

21

VolatileRead byte statis publik (alamat byte referensi)

VolatileRead ganda statis publik (ref alamat ganda)

public static int VolatileRead(ref int address)

VolatileRead Obyek statis publik(ref Object address)

Membaca nilai bidang. Nilai adalah yang terbaru yang ditulis oleh prosesor mana pun di komputer, terlepas dari jumlah prosesor atau status cache prosesor. Metode ini memiliki bentuk kelebihan beban yang berbeda. Hanya beberapa yang diberikan di atas.

22

public static void VolatileWrite(alamat byte referensi, nilai byte)

public static void VolatileWrite(ref double address, double value)

public static void VolatileWrite(ref int address, int value)

public static void VolatileWrite(ref Object address, Object value)

Menulis nilai ke bidang segera, sehingga nilai terlihat oleh semua prosesor di komputer. Metode ini memiliki bentuk kelebihan beban yang berbeda. Hanya beberapa yang diberikan di atas.

23

hasil bool statis publik()

Menyebabkan utas pemanggil menghasilkan eksekusi ke utas lain yang siap dijalankan pada prosesor saat ini. Sistem operasi memilih utas untuk menghasilkan.

Membuat Utas

Thread dibuat dengan memperluas kelas Thread. Kelas Thread yang diperluas kemudian memanggil Start() metode untuk memulai eksekusi utas anak.

Program berikut menunjukkan konsep

Demo Langsung
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut

In Main: Creating the Child thread
Child thread starts

Mengelola Utas

Kelas Thread menyediakan berbagai metode untuk mengelola thread.

Contoh berikut menunjukkan penggunaan sleep() metode untuk membuat utas berhenti untuk jangka waktu tertentu.

Demo Langsung
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         Console.WriteLine("Child thread starts");
         
         // the thread is paused for 5000 milliseconds
         int sleepfor = 5000; 
         
         Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
         Thread.Sleep(sleepfor);
         Console.WriteLine("Child thread resumes");
      }
      
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

Menghancurkan Utas

Abort() metode ini digunakan untuk menghancurkan utas.

Runtime membatalkan utas dengan melemparkan ThreadAbortException . Pengecualian ini tidak dapat ditangkap, kontrol dikirim ke akhirnya blokir, jika ada.

Program berikut mengilustrasikan hal ini

Demo Langsung
using System;
using System.Threading;

namespace MultithreadingApplication {
   class ThreadCreationProgram {
      public static void CallToChildThread() {
         try {
            Console.WriteLine("Child thread starts");
            
            // do some work, like counting to 10
            for (int counter = 0; counter <= 10; counter++) {
               Thread.Sleep(500);
               Console.WriteLine(counter);
            }
            
            Console.WriteLine("Child Thread Completed");
         } catch (ThreadAbortException e) {
            Console.WriteLine("Thread Abort Exception");
         } finally {
            Console.WriteLine("Couldn't catch the Thread Exception");
         }
      }
      static void Main(string[] args) {
         ThreadStart childref = new ThreadStart(CallToChildThread);
         Console.WriteLine("In Main: Creating the Child thread");
         
         Thread childThread = new Thread(childref);
         childThread.Start();
         
         //stop the main thread for some time
         Thread.Sleep(2000);
         
         //now abort the child
         Console.WriteLine("In Main: Aborting the Child thread");
         
         childThread.Abort();
         Console.ReadKey();
      }
   }
}

Ketika kode di atas dikompilasi dan dieksekusi, menghasilkan hasil sebagai berikut

In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

Bahasa C

  1. Diameter Pengencang Kecil vs Besar
  2. Utas
  3. Utas Vs. ZigBee (Untuk Insinyur IoT)
  4. Menganalisis opsi perawatan utas
  5. C++ Multithreading
  6. Python - Pemrograman Multithreaded
  7. Edge Computing Akhirnya Mendapat Kerangka
  8. Penerangan Bagian Belakang Menjadi Cepat
  9. Memahami Thread Digital
  10. Apa itu Pemotong Benang?