220 likes | 455 Views
MULTI-THREADING PROGRAMMING Csharp. (LẬP TRÌNH ĐA LUỒNG). NỘI DUNG. Các khái niệm vê ̀ Thread Tạo va ̀ diều khiển Thread Tạo Thread Truyền dữ liệu cho Thread Đô ̣ ưu tiên của Thread Các vấn đê ̀ của Thread Vấn đê ̀ Race Condition Vấn đê ̀ Deadlock
E N D
MULTI-THREADING PROGRAMMINGCsharp (LẬP TRÌNH ĐA LUỒNG)
NỘI DUNG • Cáckháiniệmvề Thread • Tạovà diềukhiển Thread • Tạo Thread • Truyềndữliệucho Thread • Độ ưutiêncủa Thread • Cácvấnđề của Thread • Vấnđề Race Condition • Vấnđề Deadlock • Cáckỹthuậtđồngbộ
Thread (concurrent programming) LậpTrìnhĐồngThời multiple threads
Thread (concurrent programming) LậpTrìnhĐồngThời • Thread: Làmộtphần code cóthểthựchiệnđượctrongchươngtrình • Mộtứngdụnglàmộttậphợpnhiềunhiệmvụ(Task), mỗinhiệmvụđượcgánchomột Thread • Nhiều Thread đượcthựchiệnđồngthờiđượcgọilà Multiple Threading
Thread (concurrent programming) LậpTrìnhĐồngThời • Khimộtứngdụng C# ở phía client đượcthựcthithìmột thread đượctựđộngtạorabởi CLR gọilà Main thread. • Từ Main thread tacóthểtạoracác Thread khác. • CLR cấpchomỗi Thread mộtvùngnhớriêngđểlưucácbiếncụcbộcủanó.
Ứngdụngcủa Thread • Duytrìsựđápứngcủagiaodiệnđốivớithaotáccủangườidùng • Sửdụng CPU hiệuquảhơn • Chươngtrìnhthựchiệnnhanhhơn • Cho phépcácyêucầucóthểxửlýđồngthời
TạoThreads • Tạomộtđốitượngthuộc class Thread vàtruyềnchonóphươngthứcsẽthựchiệnkhi Thread bắtđầuthựcthi (start) • Gọiphươngthức start đểbắtđầumột Thread • Truyềnthamsốcho Thread: • Thông qua phươngthức start (chỉdùngđượckhiphươngthứccó 1 thamsốkiểu Object) • Dùngbiểuthức Lambda khitạođốitượng (Phươngthứccósốthamsốvàkiểudữliệutùy ý)
Tạo Threads (cont.) • Vídụ: Tạo, thựchiện Thread
Tạo Threads (cont.) • Vídụ: Tạovàthựchiện Thread
Phươngthức Join • Join: yêucầu “call thread” phảichờcác “called thread” kếtthúcrồimớikếtthúc • Vídụ: Khôngsửdụng join
Phươngthức Sleep • Vídụ: sửdụngphươngthức join
Phươngthức Sleep • Tạmdừng thread hiệntạitrongmộtkhoảngthờigian (tinhbằngmilisecond) • Khimột thread ở trạngthái sleep thìcpuđượcdùngbởi Thread khác • Vídụ: Khôngdùng sleep
Phươngthức Sleep • Vídụ: Sửdụngthread.Sleep
Độưutiêncủa Thread (Thread Priority) • Cho phépHệđiềuhànhquyếtđịnh: • Thờigiansửdụng CPU của Thread • Cơhộinhậnquyềnsửdụng CPU • Độưutiênđượcgánbằngmộttrongcácgiátrịcủaenum: • Vídụ:
Hợpnhấtcác Thread (Thread Pooling) • Cho phépquảnlýcác Thread hiệuquảhơn • Quyếtđịnhkhinàothì start một thread • Cho phép qui địnhsố Thread tốiđa, tốithiểucóthểthựchiệnđồngthời
Cácvấnđềkhisửdụng Thread (Threading Issues ) • Race Condition: Xuấthiệnkhihai hay nhiều Thread truyxuấtcùngmộttàinguyêntạicùngmộtthờiđiểm. • Vídụ: Xuấtthôngbáokhi state!=6
Cácvấnđềkhisửdụng Thread (Threading Issues ) • Race Condition: • Tạo 20 Thread, mỗi Thread sẽthựchiệnhàmRaceCondition , thamsốtruyềncho 20 Thread làđốitượng state dẫnđến Race Condition • Nguyênnhân?
Cácvấnđềkhisửdụng Thread (Threading Issues ) Đồngbộgiữacác Thread (Synchronization ): • Đểtránhtìnhtrạng Race Codition sửdụnggiảiphápđộngbộ (Synchronization). • Synchronization: một Thread khimuốnsửdụngmộttàinguyên (nếuchưasửdụngbởinhững Thread khác), nósẽ lock tàinguyênđóchođếnkhisửdụngxong. Các thread khácmuốnsửdụngtàinguyênnàyphảichờđếnkhitàinguyênđược unlock.
Cácvấnđềkhisửdụng Thread (Threading Issues ) Đồngbộgiữacác Thread (Synchronization ): • Dùngcơchế Locking đểđồngbộ: Lock trênmộtđốitượngtrướckhithựchiệnlệnh Unlock đốitượngkhithựchiệnxong
Cácvấnđềkhisửdụng Thread (Threading Issues ) Đồngbộgiữacác Thread (Synchronization ): • Đốitượngdùngtrong Lock: • Visible chotấtcảcácphầncủa Thread (thườngkhaibáotrong class) • Phảicókiểulà reference • Pham vi trong class: Private, Readonly
Cácvấnđềkhisửdụng Thread (Threading Issues ) Deadlock :xảyrakhihai Thread cùngchờđểsửdụngtàinguyênđang lock bởi Thread kia (Thread 1 cố lock đốitượngđangsửdụngbởi Thread 2 vàngượclại) • Đểngănchặn Deadlock: DùngMonitor.TryEntervới timeout
Cơchế Wait-Notify • Dùngđểđiềukhiểnsựphốihợpgiữacác Thread • Bàitoán Producer-Consumer (sảnxuất – Tiêuthụ) • C# dùngđốitượngcủalớpEventWaitHandleđểcàiđặtcơchếWait-Notify • CácphươngthứccủaEventWaitHandle: • WaitOne: Block Thread hiệntại, chođếnkhinhậnđược Notify từmột Thread khác • Set: Notify các Thread đang ở chếđộ waiting • Vídụ: xemvídụnonWaitNotifyvàThreadWaitNotify • (dong boket hop phoi hop)