Computer >> Máy Tính >  >> Lập trình >> C#

Semaphore trong C #

Lớp semaphore cho phép bạn đặt giới hạn về số luồng có quyền truy cập vào phần quan trọng. Lớp được sử dụng để kiểm soát quyền truy cập vào một nhóm tài nguyên. System.Threading.Semaphore là không gian tên cho Semaphore vì nó có tất cả các phương thức và thuộc tính cần thiết để triển khai Semaphore.

Để sử dụng semaphore trong C #, bạn chỉ cần khởi tạo một thể hiện của đối tượng Semaphore. Nó có tối thiểu hai đối số -

Tham khảo

-

MSDN

Sr.No. Khối mã lệnh &Mô tả
1 Semaphore (Int32, Int32)
Khởi tạo một thể hiện mới của lớp Semaphore, xác định số lượng mục nhập ban đầu và số lượng mục nhập đồng thời tối đa.
2 Semaphore (Int32, Int32, String) -
Khởi tạo một phiên bản mới của lớp Semaphore, chỉ định số lượng mục nhập ban đầu và số lượng mục nhập đồng thời tối đa, và tùy chọn chỉ định tên của đối tượng semaphore hệ thống.
3 Semaphore (Int32, Int32, String, Boolean)
Khởi tạo một phiên bản mới của lớp Semaphore, chỉ định số lượng mục nhập ban đầu và số lượng mục nhập đồng thời tối đa, tùy chọn chỉ định tên của đối tượng semaphore hệ thống và chỉ định một biến nhận giá trị cho biết liệu semaphore hệ thống mới đã được tạo hay chưa.

Bây giờ chúng ta hãy xem một ví dụ:

Ở đây, chúng tôi đã sử dụng hàm tạo Semaphore sau để khởi tạo một phiên bản mới của lớp Semaphore, chỉ định số lượng tối đa các mục nhập đồng thời và tùy chọn đặt trước một số mục nhập.

static Semaphore semaphore = new Semaphore(2, 2);

Ví dụ

using System;
using System.Threading;
namespace Program
{
class Demo
   {
      static Thread[] t = new Thread[5];
      static Semaphore semaphore = new Semaphore(2, 2);
      static void DoSomething()
      {
         Console.WriteLine("{0} = waiting", Thread.CurrentThread.Name);
         semaphore.WaitOne();
         Console.WriteLine("{0} begins!", Thread.CurrentThread.Name);
         Thread.Sleep(1000);
         Console.WriteLine("{0} releasing...", Thread.CurrentThread.Name);
         semaphore.Release();
      }
      static void Main(string[] args)
      {
         for (int j = 0; j < 5; j++)
         {
            t[j] = new Thread(DoSomething);
            t[j].Name = "thread number " + j;
            t[j].Start();
         }
         Console.Read();
      }
   }
}

Đầu ra

Sau đây là kết quả

thread number 2 = waiting
thread number 0 = waiting
thread number 3 = waiting
thread number 1 = waiting
thread number 4 = waiting
thread number 2 begins!
thread number 1 begins!
thread number 2 releasing...
thread number 1 releasing...
thread number 4 begins!
thread number 3 begins!
thread number 4 releasing...
thread number 0 begins!
thread number 3 releasing...
thread number 0 releasing...