Multi Thread | Kỹ thuật đa luồng trong Lập trình Csharp

Multi Thread

Trong bài viết hôm nay chúng ta sẽ tìm hiểu về một kỹ thuật trong lập trình Csharp .NET nhằm giúp tăng tốc chương trình, cải thiện tốc độ xử lý. Cái mà tôi đang nói đến chính là kỹ thuật MultiThread, hiểu đơn giản là tạo 1 chương trình sao cho có hơn 1 luồng dữ liệu được xử lý trong đó. Ta thấy ở thời điểm hiện nay ngành công nghệ phần cứng đang phát triển mạnh mẽ, máy tính và các thiết bị di động được trang bị các bộ xử lý đa nhân để có thể làm được cùng một lúc nhiều công việc hơn – Xử lý song song. Việc phát triển chương trình chạy đa luồng cũng có ý nghĩa rất lớn bên ngành mạng viễn thông, giúp tăng tốc và cải thiện đường truyền tín hiệu…

Trong .NET các hàm xử lý Thread được định nghĩa bên trong namespace System.Threading; Trong một chương trình có xử lý đa luồng nghĩa là có hơn 1 luồng dữ liệu cùng được xử lý đồng thời và được đồng bộ hóa theo 1 cơ chế định thời bên trong .NET.

1. Ví dụ minh họa về Multi Thread

Trong ví dụ bên dưới ta lần lượt khởi tạo 3 Thread t1, t2, t3. Tương ứng với 3 Thread sẽ có 3 hàm static a() , b() , c(). Ta thấy khi khởi tạo Thread ta truyền đối số là là hàm static như truyền một con trỏ hàm. Và hiển nhiên khi một Thread bất kỳ được khởi chạy thì nó sẽ thực hiện công việc công việc được giao ban đầu. Công việc của các hàm a() , b() , c() là in ra các ký tự được định nghĩa bên trong nó. Nếu như thông thường, ta gọi 3 hàm đó theo đúng thứ tự như trong ví dụ bên dưới thì kết quả thu được sẽ là: In ra 100 ký tự “+”, 100 ký tự “-” và cuối cùng là 100 ký tự “o”. Nhưng ở đây ta cho 3 hàm cùng thực hiện song song, nên các ký tự sẽ được in ra xen kẽ nhau.

Multi Thread trong Lập trình Csharp | MicrosoftTech.Net
Kết quả:
Multi Thread trong Lập trình Csharp | MicrosoftTech.Net2. Một số phương thức thông dụng cho việc xử lý Thread

  • Abort():Với phương thức này sau khi được gọi thì Thread sẽ chuyển sang trạng thái dừng, và thuộc tính ThreadState sẽ trả về giá trị Stopped.
  • Suspend():Thread khi đang chạy nếu gọi phương thức Suspend() thì sẽ dừng hoạt động cho tới khi gọi lại bằng phương thức Resyme().
  • Sleep(): Khi một Thread đang chạy nếu phương thức Sleep được gọi thì sẽ rơi vào trạng thời chờ trong một khoảng thời gian t (tính theo miligiây) sẽ tiếp tục hoạt động. Vị dụ: System.Threading.Thread.Sleep(1000); Khi phương thức này được gọi thì Thread sẽ tạm dừng trong vòng 1000 miligiây. Ta thấy đây là một phương thức tĩnh nên có thể gọi mà không cần thông qua instance Thread nào cả.
  • Join():Đây là một phương thức tôi thấy rất hay dùng khi xử lý Thread. Ta có thể hiểu ý nghĩa có phương thức này như sau: Khi một Thread gọi phương thức Join thì Thread đó sẽ được ưu tiên trong hệ thống. Những lện nào nằm sau phương thức Joinn chỉ được thực thi khi Thread kết thúc. Những lệnh đã chạy từ trước thì vẫn được thực thi với Thread hiện tại, và không có ảnh hưởng gì.

3. Ví dụ phương thức Join trong Thread

Ví dụ này tương tự ví dụ bên trên, chỉ khác ở chỗ: Thread t1, t2 gọi phương thức Join trước khi Thread t3 Start(). Vì lý do này nên t1 và t2 sẽ cùng được xử lý cho đến khi cả 2 đều kết thúc thì t3 mới bắt đầu thực thi. Nhìn vào kết quả trả về ta dễ dàng thấy: Các ký tự “+”, “-” lần lượt được in ra cho đến khi cả 2 kết thúc thì ký tự “o” mới bắt đầu được in ra.

Multi Thread trong Lập trình Csharp | MicrosoftTech.Net
Kết quả:
Multi Thread trong Lập trình Csharp | MicrosoftTech.Net
4. Truyền tham số cho Thread

Ví dụ bên dưới hướng dẫn cách truyền tham số cho Thread thông qua cơ chế của ParameterizedThreadStart. Đầu tiên ta tạo 1 mảng 4 Thread và lần lượt khởi tạo thông qua 1 instance của ParameterizedThreadStart. Instance này được tạo thông qua con trỏ hàm gọi tới Hàm static Start(object info); Khi gọi phương thức Start() đi kèm với 1 tham số, và tham số này sẽ truyền vào hàm Start thông qua tham số info kiểu object
Multi Thread trong Lập trình Csharp | MicrosoftTech.Net

MicrosoftTech.Net

Bài viết với Chủ đề Liên quan


Leave a Reply

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>