Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 35 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
35
Dung lượng
397,5 KB
Nội dung
Chương 12–Đatiếntrình- Multithreading
Outline
12.1 Giới thiệu
12.2 Các trạng thái của một tiến trình
12.3 Các mức ưu tiên của tiếntrình
12.4 Đồng bộ tiếntrình và lớp điều khiển
12.5 Tạo/ dùng tiếntrình không đồng bộ hoá
12.6 Tạo/dùng tiếntrình có đồng bộ hoá
12.7 Các thao tác với các tiến trình. Ví dụ
12.1 Giới thiệu
Hầu hết các ngôn ngữ lập trình chỉ cho phép chạy một câu lệnh một lúc
Việc chạy câu lệnh truyền thống cũng đồng thời được thực hiện
dùng hệ điều hành gốc
.NET Framework Class Library hỗ trợ cơ chế đatiếntrình
Đa tiếntrình (Multithreading) : chạy đồng thời các tiếntrình
Tiến trình (thread ): một phần của chươngtrình có thể chạy được
12.2 Các trạng thái của một tiến trình
Một tiếntrình có thể có nhiều trạng thái khác nhau trong chu kỳ sống của nó
(từ lúc được tạo ra cho đến khi kết thúc và bị phá huỷ ) .
Unstarted (chưa bắt đầu)
Khi một tiếntrình bắt đầu chu kỳ sống
Tồn tại cho tới khi phương thức Start được gọi
Started (bắt đầu):
Tồn tại ở trạng thái này cho tới khi bộ xử lý bắt đầu chạy nó
12.2 Các trạng thái của một tiến trình
Running (đang chạy ):
Tiến trình nào có mức ưu tiên cao nhất thì được chạy trước
Bắt đầu chạy khi bộ xử lý được cấp phát cho tiếntrình
ThreadStart là uỷ quyền đặc biệt cho các hoạt động của tiến
trình
Stopped (ngừng):
Khi kết thúc uỷ quyền
Nếu chươngtrình gọi phương thức Abortcủa Thread
Blocked :
Blocked khi có yêu cầu vào/ra
Kết thúc blocked khi hệ điều hành đã hoàn thành quá trình
vào/ra
WaitSleepJoin:
Có 3 cách rơi vào trạng thái này:
Tiến trình gọi phương thức Wait của Monitor vì nó bắt gặp code
mà nó chưa thể thực hiện
Kết thúc trạng thái khi một tiếntrình khác gọi Pulse
Gọi phương thức Sleep để tạm dừng trong một khoảng thời gian
nhất định
Hai tiếntrình được hợp nhất nếu một không thể thực hiện cho tới khi
tiến trình kia kết thúc
Các tiếntrình chờ hay tạm dừng có thể thoát khỏi các trạng thái này nếu
gọi phương thức Interrupt
Suspended (treo):
Trạng thái này xảy ra khi gọi phương thức Suspend
Trở về trạng thái Started khi gọi phương thức Resume
12.2 Các trạng thái của một tiến trình
Vòng đời của một tiếntrình
WaitSleepJoin Suspended Stopped
Blocked
Unstarted
Started
Running
dispatch
(assign a
processor)
Start
Resume
In
te
rr
u
pt
Pu
ls
e
Pu
ls
eA
l
l
sle
ep
in
ter
val
ex
pi
res
quantum
expiration
S
u
s
p
e
n
d
Wait
Sleep,
Join
comp
lete
iss
ue
I
/O
req
u
es
t
I
/
O
c
o
m
p
l
e
t
io
n
12.2 Các trạng thái của một tiến trình
12.3 Các mức ưu tiên của tiếntrình
Tất cả các tiếntrình đều có mức độ ưu tiên riêng :
Các mức: Lowest, BelowNormal, Normal, AboveNormal, và
Highest
Tất cả các tiếntrình có mức ưu tiên mặc định là Normal (bình
thường)
Dùng thuộc tính Priority để điều chỉnh mức độ ưu tiên của
các tiến trình
Timeslicing(thời gian cắt ) :
Mỗi tiếntrình đều có một khoảng thời gian ngắn được chạy trước
khi bộ xử lý được chuyển cho tiếntrình khác
Không có nó,các tiếntrình sẽ được chạy xong hết trước khi một
tiến trình khác bắt đầu
Thread Scheduler (lập lịch trình cho các tiến trình) :
Giữ cho các tiếntrình có mức độ ưu tiên cao nhất luôn được
chạy
Nếu nhiều tiếntrình có cùng mức ưu tiên : chạy lần lượt theo
vòng tròn
Đôi khi dẫn đến sự thiếu trầm trọng:
Những tiếntrình có độ ưu tiên thấp bị trì hoãn việc chạy
12.3 Các mức ưu tiên của tiếntrình
Lịch trình theo mức độ ưu tiên của các tiến trình
Priority Highest
Priority AboveNormal
Priority Normal
Priority BelowNormal
Priority Lowest
A B
C
D E F
G
Tiến trìnhđã sẵn sàng
12.3 Các mức ưu tiên của tiếntrình
12.4 Đồng bộ tiếntrình và lớp điều khiển
Các kết quả sai có thể xảy ra nếu hai tiếntrình cố gắng cùng cập nhật một phần dữ
liệu trong cùng thời điểm
Thread Synchronization (đồng bộ tiến trình):
Khi một tiếntrình đang thao tác với dữ liệu thì các tiếntrình khác phải
chờ
Monitors :
Lớp Monitor dùng để đồng bộ hoá
Khoá các đối tượng:chỉ một tiếntrình được truy cập nó trong một thời
điểm
phương thức Enter dùng để khoá đối tượng
Đối tượng có SyncBlock nhờ đó theo dõi được trạng thái khoá
[...]... hưởng đến tốc độ thực hiện chươngtrình12. 7 Các thao tác với các tiếntrình Có một cách khác để tạo ra tiếntrình là dùng lớp ThreadPool Khi dùng cách này , thay vì phải tạo ra một tiếntrình mới từ đầu , ta chỉ việc sử dụng các tiếntrình có sắn mà hệ điều hành tạo ra và chỉ đợi gán cho nó một tác vụ nào đó cần thực thi Tuy nhiên ,ThreadPool bị giới hạn tới 25 tiếntrình Tất cả các method trong... static Để tạo tiếntrình từ ThreadPool ,ta sử dụng static method QueueUserWorkItem của lớp TheadPool ThreadPool.QueueUserWorkItem (new WaitCallBack ( aFunction )) ; 12. 7 Các thao tác với các tiếntrình Không giống như Thead , tiếntrình tạo ra bởi TheadPool tự động thực hiện khi nó được tạo ra và sẽ không có một method kiểu Start cho TheadPool Để lấy về tiếntrình hiện tại (tiến trình đang running... myThread.Resume (); 12. 7 Các thao tác với các tiếntrình Để hủy một tiếntrình , ta dùng method Abort của lớp Thread Khi đó một ngoại lệ ThreadAbortException sẽ được ném ra và ta phải bắt lấy ngoại lệ này để có thể huỷ thread một cách an toàn Với tiếntrình tạo ra từ ThreadPool thì không có cách nào huỷ nó khi đã triệu gọi method QueueUserWorkItem Tiếntrình sẽ tự huỷ khi chươngtrình kết thúc Ví... Form1_Closed(object sender, System.EventArgs e) { try { rabbit1.Abort(); // Huỷ tiếntrình 1 rabbit2.Abort(); // Huỷ tiếntrình 2 } catch(ThreadAbortException ex2) {} finally { Process.GetCurrentProcess().Kill(); // Kết thúc chươngtrình // Điều này nên có để ngăn chặn việc gặp lỗi trong quá trình } // huỷ tiếntrình mà chươngtrình vẫn chưa kết thúc hoàn toàn } } // Kết thúc lớp } // Kết thúc namespace... WaitSleepJoin Khi phương thức Pulse được gọi với một tham số là đối tượng ,tiến trình được giải phóng khỏi trạng thái WaitSleepJoin 12. 4 Đồng bộ tiếntrình và lớp điều khiển Đồng bộ truy cập dùng Mutex Lớp Mutex :một tiếntrình chỉ có thể truy cập đến đối tượng nào đó nếu nó có được Mutex ( mutually exclusive ) của đối tượng đó Một tiếntrình cũng có thể nhả Mutex nếu nó không cần truy cập đối tượng... ReleaseMutex() 12. 5 Tạo/ dùng tiếntrình không đồng bộ hoá Produce Tạo một tiếntrình và đặt nó trong bộ nhớ đệm Consumer đọc dữ liệu từ bộ nhớ đệm đó Producer và consumer nên liên lạc để cho phép dữ liệu hợp lệ được đọc Lỗi logic xảy ra nếu các tiếntrình không được đồng bộ Producer có thể ghi đè dữ liệu trước khi consumer đọc nó Consumer đọc sai dữ liệu hoặc đọc một dữ liệu hai lần 12. 6 Tạo/dùng tiến. . .12. 4 Đồng bộ tiến trình và lớp điều khiển Các tiến trình cố truy cập vào đối tượng bị khoá sẽ rơi vào trạng thái blocked Khi một tiến trình đã làm việc xong với một đối tượng nó dùng phương thức Exit để ngừng khoá đối tượng đó Từ khoá lock cũng có thể được dùng để khoá đối tượng Nếu tiến trình không thể thực hiện nhiệm vụ của mình trên đối... toàn } } // Kết thúc lớp } // Kết thúc namespace Ví dụ : Cuộc đua của hai chú thỏ Giao diện ban đầu Ví dụ : Cuộc đua của hai chú thỏ tiếntrình 1 đang chạy , tiếntrình 2 bị treo Ví dụ : Cuộc đua của hai chú thỏ Tạo tiếntrình bằng ThreadPool Status bar chỉ ra hai tiếntrình tạo ban đầu đã bị huỷ ... ta đã gọi phương thức ThreadPool.QueueUserWorkItem để gắn công việc mà tiếntrình sẽ thực hiện với một method nào đó thì ta không thể Suspend , Stop nó nữa ngoài cách kết thúc chươngtrình Ngoài ra , ví dụ cũng cho phép thay đổi mức ưu tiên của các tiếntrình Tuy nhiên , để thấy được ảnh hưởng của mức độ ưu tiên lên các tiếntrình thì cần phải thay đổi cả vận tốc chuyển động của các chú thỏ Ví dụ... Tạo/dùng tiếntrình có đồng bộ hoá Việc đồng bộ hoá đảm bảo đạt được kết quả đúng : Producer chỉ tạo kết quả sau khi consumer đã đọc kết quả trước đó Consumer chỉ đọc khi producer ghi giá trị mới 12. 7 Các thao tác với các tiếntrình Tạo ra một tiếntrình mới và gắn một tác vụ cụ thể cho nó:2 cách Cách thứ nhất là dùng lớp Thread Phương thức khởi dựng của nó dùng để tạo ra một tiếntrình mới : .
Chương 12 – Đa tiến trình - Multithreading
Outline
12. 1 Giới thiệu
12. 2 Các trạng thái của một tiến trình
12. 3 Các mức ưu tiên của tiến trình
12. 4. hỗ trợ cơ chế đa tiến trình
Đa tiến trình (Multithreading) : chạy đồng thời các tiến trình
Tiến trình (thread ): một phần của chương trình có thể