3_MultiThreading

Download Report

Transcript 3_MultiThreading

MULTI-THREADING PROGRAMMING
Csharp
(LẬP TRÌNH ĐA LUỒNG)
NỘI DUNG


Các khái niệm về Thread
Tạo và diều khiển Thread




Các vấn đề của Thread



Tạo Thread
Truyền dữ liệu cho Thread
Độ ưu tiên của Thread
Vấn đề Race Condition
Vấn đề Deadlock
Các kỹ thuật đồng bộ
@2011 HUI
Thread (concurrent programming)
Lập Trình Đồng Thời
multiple
threads
@2011 HUI
Thread (concurrent programming)
Lập Trình Đồng Thời

Thread: Là một phần code có thể thực hiện được
trong chương trình


Một ứng dụng là một tập hợp nhiều nhiệm vụ(Task), mỗi
nhiệm vụ được gán cho một Thread
Nhiều Thread được thực hiện đồng thời được gọi là
Multiple Threading
@2011 HUI
Thread (concurrent programming)
Lập Trình Đồng Thời



Khi một ứng dụng C# ở phía client được thực thi thì
một thread được tự động tạo ra bởi CLR gọi là
Main thread.
Từ Main thread ta có thể tạo ra các Thread khác.
CLR cấp cho mỗi Thread một vùng nhớ riêng để lưu
các biến cục bộ của nó.
@2011 HUI
Ứng dụng của Thread

Duy trì sự đáp ứng của giao diện đối với thao tác của
người dùng

Sử dụng CPU hiệu quả hơn

Chương trình thực hiện nhanh hơn

Cho phép các yêu cầu có thể xử lý đồng thời
@2011 HUI
Tạo Threads

Tạo một đối tượng thuộc class Thread và truyền cho
nó phương thức sẽ thực hiện khi Thread bắt đầu
thực thi (start)
Gọi phương thức start để bắt đầu một Thread

Truyền tham số cho Thread:



@2011 HUI
Thông qua phương thức start (chỉ dùng được khi phương
thức có 1 tham số kiểu Object)
Dùng biểu thức Lambda khi tạo đối tượng (Phương thức
có số tham số và kiểu dữ liệu tùy ý)
Tạo Threads (cont.)
 Ví dụ: Tạo, thực hiện Thread
@2011 HUI
Tạo Threads (cont.)
 Ví dụ: Tạo và thực hiện Thread
@2011 HUI
Phương thức Join
Join: yêu cầu “call thread” phải chờ các “called
thread” kết thúc rồi mới kết thúc
 Ví dụ: Không sử dụng join

@2011 HUI
Phương thức Sleep

Ví dụ: sử dụng phương thức join
@2011 HUI
Phương thức Sleep
Tạm dừng thread hiện tại trong một khoảng thời
gian (tinh bằng milisecond)
 Khi một thread ở trạng thái sleep thì cpu được
dùng bởi Thread khác
 Ví dụ: Không dùng sleep

@2011 HUI
Phương thức Sleep

Ví dụ: Sử dụng thread.Sleep
@2011 HUI
Độ ưu tiên của Thread
(Thread Priority)
 Cho phép Hệ điều hành quyết định:
 Thời gian sử dụng CPU của Thread
 Cơ hội nhận quyền sử dụng CPU
 Độ ưu tiên được gán bằng một trong các giá trị của
enum:
 Ví dụ:
@2011 HUI
Hợp nhất các Thread
(Thread Pooling)
 Cho phép quản lý các Thread hiệu quả hơn
 Quyết định khi nào thì start một thread
 Cho phép qui định số Thread tối đa, tối thiểu có thể
thực hiện đồng thời
@2011 HUI
Các vấn đề khi sử dụng Thread
(Threading Issues )
 Race Condition: Xuất hiện khi hai hay nhiều Thread
truy xuất cùng một tài nguyên tại cùng một thời điểm.
 Ví dụ:
Xuất thông báo khi
state!=6
@2011 HUI

Các vấn đề khi sử dụng Thread
(Threading Issues )
Race Condition:
Tạo 20 Thread, mỗi Thread sẽ thực hiện hàm
RaceCondition , tham số truyền cho 20 Thread là đối
tượng state dẫn đến Race Condition
 Nguyên nhân?

@2011 HUI
Các vấn đề khi sử dụng Thread
(Threading Issues )
Đồng bộ giữa các Thread (Synchronization ):
 Để tránh tình trạng Race Codition  sử dụng giải
pháp động bộ (Synchronization).
 Synchronization: một Thread khi muốn sử dụng một
tài nguyên (nếu chưa sử dụng bởi những Thread khác),
nó sẽ lock tài nguyên đó cho đến khi sử dụng xong. Các
thread khác muốn sử dụng tài nguyên này phải chờ
đến khi tài nguyên được unlock.
@2011 HUI
Các vấn đề khi sử dụng Thread
(Threading Issues )
Đồng bộ giữa các Thread (Synchronization ):
 Dùng cơ chế Locking để đồng bộ:
Lock trên một đối
tượng trước khi thực
hiện lệnh
Unlock đối
tượng khi thực
hiện xong
@2011 HUI
Các vấn đề khi sử dụng Thread
(Threading Issues )
Đồng bộ giữa các Thread (Synchronization ):
 Đối tượng dùng trong Lock:
Visible cho tất cả các phần của Thread (thường khai báo
trong class)
 Phải có kiểu là reference
 Pham vi trong class: Private, Readonly

@2011 HUI
Các vấn đề khi sử dụng Thread
(Threading Issues )
Deadlock : xảy ra khi hai Thread cùng chờ để sử dụng
tài nguyên đang lock bởi Thread kia (Thread 1 cố lock
đối tượng đang sử dụng bởi Thread 2 và ngược lại)

Để ngăn chặn Deadlock: Dùng Monitor.TryEnter với
timeout
@2011 HUI
Cơ chế Wait-Notify

Dùng để điều khiển sự phối hợp giữa các Thread



C# dùng đối tượng của lớp EventWaitHandle để cài đặt
cơ chế Wait-Notify
Các phương thức của EventWaitHandle:



Bài toán Producer-Consumer (sản xuất – Tiêu thụ)
WaitOne: Block Thread hiện tại, cho đến khi nhận được Notify từ một
Thread khác
Set: Notify các Thread đang ở chế độ waiting
Ví dụ: xem ví dụ nonWaitNotify và ThreadWaitNotify
 (dong bo ket hop phoi hop)
@2011 HUI