TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
1
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Bài 10: Threading
• Khai báo và khởi tạo tiến trình
•
Lậ tì hkhô đồ bộ
•
Lậ
p
t
r
ì
n
h
khô
ng
đồ
ng
bộ
2
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Threading
• Threading là mộtkháiniệm quan trọng trong phát
triểnphầnmềm, hỗ trợ thựchiệnnhiềutácvụ tại
ù
ột
thời
điể
c
ù
ng m
ột
thời
điể
m.
• Hầuhết các tác vụđềucóthờigianchết (downtime),
với
threading,
ta
có
thể
cho
bộ
xử
lý
tiếp
tục
thực
với
threading,
ta
có
thể
cho
bộ
xử
lý
tiếp
tục
thực
hiện công việc trong suốtthờigianđó.
• Lớp Thread được dùng để tạovàthựcthicáctiến
trình.
3
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Các thuộc tính và phương thức của tiến trình
ế
• Các thao tác trên ti
ế
n trình
4
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
•
Các thuộctínhvàphương thứccủatiếntrình
•
Các
thuộc
tính
và
phương
thức
của
tiến
trình
− Các thuộc tính
•
IsAlive
•
IsAlive
• IsBackground
• IsThreadPoolThread
• ManagedThread
• Name
• Priority
• ThreadState
5
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Các thuộc tính và phương thức của tiến trình
−
Các thuộc tính tĩnh (static properties)
Các
thuộc
tính
tĩnh
(static
properties)
• CurrentContext
• CurrentPrinci
p
al
p
• CurrentThread
6
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Các thuộc tính và phương thức của tiến trình
−
Các phương thức
Các
phương
thức
• Abort
• Interru
p
p
• Join
• Resume
• Start
• Suspend
7
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
•
Các thuộctínhvàphương thứccủatiếntrình
•
Các
thuộc
tính
và
phương
thức
của
tiến
trình
− Các phương thức tĩnh (static methods)
•
BeginCriticalRegion
•
BeginCriticalRegion
• EndCriticalRegion
•
Get
D
o
m
a
in
Get o a
• GetDomainID
• ResetAbort
• Sleep
• SpinWait
•
VltilR d
8
•
V
o
l
a
til
e
R
ea
d
• VolatileWrite
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Các thao tác trên tiến trình
−
Khởitạotiếntrình
Khởi
tạo
tiến
trình
− Thực thi tiến trình
−
Ghép nốicáctiếntrình
−
Ghép
nối
các
tiến
trình
− Tạm dừng và hủy bỏ vĩnh viễn
9
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Khởi tạo tiến trình
−
Trong NET Framework namespace
Trong
.
NET
Framework
,
namespace
System.Threading chứa các kiểu được dùng để tạo
và quản lý đa tiến trình trong ứng dụng
ế
− Khởi tạo ti
ế
n trình:
• Tạo phương thức không tham số, không kiểu dữ liệu trả
về
về
• Tạo ủy nhiệm hàm ThreadStart với phương thức vừa tạo
• Tạo Thread mới với ủy nhiệm hàm ThreadStart vừa tạo
10
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Thực thi tiến trình
−
Tiếntrìnhđượckhởitạosẽ không tự động thựcthi
Tiến
trình
được
khởi
tạo
sẽ
không
tự
động
thực
thi
.
− Gọi phương thức Start để thực thi tiến trình
11
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
Dkhởi à
•
D
emo
khởi
tạo v
à
thực thi tiến trình:
•
T ộth
Static void SimpleWork(){
Console.WriteLine(“Thread: {0}
•
T
ạo m
ột
p
h
ương
thức không tham số,
không trả về dữ liệu.
”,Thread.CurrentThread.Manag
edThreadID);
}
• Tạo ủy nhiệm
ThreadStart
•
T Th d ới
ThreadStart op=new
ThreadStart(SimpleWork);
Th d Th d Th d(
)
•
T
ạo
Th
rea
d
m
ới
• Gọi phương thức
Start để thựcthitiến
Th
rea
d
my
Th
rea
d
=new
Th
rea
d(
op
)
;
myThread.Start();
12
Start
để
thực
thi
tiến
trình mới.
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
ế
• Thực thi đa ti
ế
n trình
− Điểm mạnh của Thread là hỗ trợ xử lý đa tiến trình tại
cùng 1 thời điểm
cùng
1
thời
điểm
.
− Ta có thể sửa lại đoạn code trên để hỗ trợ xử lý đa tiến
trình như sau:
ThreadStart op=new TharedStart();
for (int i=0;i<5;i++){
Thread myThread=new Thread(op);
myThread.Start();
}
13
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
•
Ghép
nối
các
tiến
trình
•
Ghép
nối
các
tiến
trình
− Khi khốilượng công
việc
và
thời
gian
xử
lý
ThreadStart op=new
ThreadStart(SimpleWork);
Thread[] myThreads=new Thread[5];
việc
và
thời
gian
xử
lý
củamỗitiếntrìnhtăng,
ta sẽ cầntiếntrình
for (int i=0;i<5;i++){
chính (main thread) chờ
cho đếnkhixử lý của
tiến
trình
đợc
hoàn
tất
myThreads[i]=new Thread(op);
myThreads[i].Start();
}
tiến
trình
đ
ư
ợc
hoàn
tất
thông qua sử dụng
p
hươn
g
thức
}
foreach (Thread t in myThreads){
t.Join
();
14
p g
Thread.Join().
();
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Threading priority
− Hỗ trợ
g
án/ lấ
y
độ ưu tiên của tiến trình thôn
g
q
ua enum
g y gq
ThreadingPriority.
− Các giá trị của ThreadingPriority
•
Highest
Highest
• AboveNormal
• Normal
• BelowNormal
• Lowest
−
Thường sử dụng giá trị default là Normal
15
Thường
sử
dụng
giá
trị
default
là
Normal
− Cân nhắc khi thay đổi độ ưu tiên của tiến trình
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
•
Tạm
dừng
và
loại
bỏ
vĩnh
viễn
Tạm
dừng
và
loại
bỏ
vĩnh
viễn
− .NET framework tựđộng dừng và giải phóng tiếntrìnhkhixử
lý hoàn tất.
− Dùng phương thức Thread.Abort() để dừng tiếntrìnhkhicó
nhu cầu.
Thread myThread=new Thread(new ThreadStart(AbortThisThread));
myHtread.Start();
myThread.Abort();
static void
AbortThisThread
(){
Có an
toàn
không ?
static
void
AbortThisThread
(){
SomeClass.IsValid=true;
SomeClase.IsComplete=true;
không
?
16
SomeClass.WriteToConsole();
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
• Tạm dừng và loại bỏ vĩnh viễn
− Dừn
g
tiến trình một cách an toàn : tạo lậ
p
critical re
g
ion với
g pg
BeginCriticalRegion và EndReticalRegion.
static void AbortThisThread(){
Thread.BeginCriticalRegion();
SomeClass.IsValid=true;
SomeClase.IsComplete
=
true;
Critical
Region
SomeClase.IsComplete true;
Thread.EndCriticalRegion();
SomeClass.WriteToConsole();
17
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Khai báo và khởi tạo tiến trình
•
T dừ àl ibỏ ĩ hiễ
Không dùng
•
T
ạm
dừ
ng v
à
l
oạ
i
bỏ
v
ĩ
n
h
v
iễ
n
− So sánh giữa có sử dụng và không sử dụng critical region
E
Không
dùng
critical
region
Start
Do work More work
E
ven
more work
Done
Thread abort
Aborted
Even
dùng critical
region
Start
Do work More work
Even
more work
Done
18
Thread abort
Aborted
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Hỗ trợ từng phầncủachương trình đượcthựcthi
trên nhiềutiến trình riêng biệt, tương tự mô hình
Ah
Pi
Mdl
(APM)
A
sync
h
ronous
P
rogramm
i
ng
M
o
d
e
l
(APM)
.
• .NET framework hỗ trợ APM qua nhiềulớpcócung
cấp
phương
thức
BeginXXX
và
EndXXX
cấp
phương
thức
BeginXXX
và
EndXXX
• Ví dụ:lớp FileStream có phương thức Read đọcdữ
liệutừ stream, nó cũng cung cấpphương thức
ỗ
BeginRead và EndRead h
ỗ
tr
ợ
mô hình
A
PM.
19
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
•
Ví d
•
Ví
d
ụ:
byte[] buffer = new byte[100];
FileStream strm = new FileStream
(
“c:/aaa.txt”
,
FileMode.O
p
en
,
(
,p,
FileAccess.Read, FileShare.Read, 1024, FileOptions.Asynchronous);
// gọi xử lý không đồng bộ
IAs
y
ncResult result = strm.Be
g
inRead
(
buffer
,
0
,
buffer.Len
g
th
,
null
,
null
);
yg(,,g,,);
// tiến hành xử lý khác trong khi chờ
// EndRead sẽ bị khóa cho đến khi xử lý không đồng bộ hoàn thành
int numBytes = strm EndRead(result);
int
numBytes
=
strm
.
EndRead(result);
strm.Close();
Console.WriteLine("Read {0}",numBytes);
20
Console.WriteLine(BitConverter.ToString(buffer));
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Cần có cách thựcthitácvụ không đồng bộ và biếtkhi
nào/ nơinàosẽ gọiphương thức EndXXX.
• Rendezvous Model : có 3 cách mà APM sử dụng để
xử lý khi kết thúc lờigọiphương thức không đồng bộ
Wit
Util
D
−
W
a
it
-
U
n
til
-
D
one
− Pooling
−
Callback
Callback
21
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
• Wait-Until-Done Model:
−
Cho
phép
bắt
đầu
lời
gọi
phương
thức
không
đồng
bộ
Cho
phép
bắt
đầu
lời
gọi
phương
thức
không
đồng
bộ
và thựcthicáctácvụ khác.
− Lời
g
ọikết thúc
p
hươn
g
thức khôn
g
đồn
g
bộ sẽ bị lock
ế
ố
ấ
g
p g
g
g
cho đ
ế
n khi phương thức không đ
ố
ng bộ hoàn t
ấ
txử
lý.
22
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
•
P lli M d l
•
P
o
lli
ng
M
o
d
e
l
− Tương tự Wait-Until-Done, nhưng có thăm dò
IAsyncResult để biếtxử lý đã hoàn tấtchưa
IAsyncResult
để
biết
xử
lý
đã
hoàn
tất
chưa
// gọi xử lý không đồng bộ
IAsyncResult result = strm.BeginRead(buffer, 0, buffer.Length, null, null);
// thăm dò xử lý hoàn tất chưa ?
While (!result.IsCompleted){
//
xử lý khác khi chưakết thúc lờigọiphương thức không đồng bộ
//
xử
lý
khác
khi
chưa
kết
thúc
lời
gọi
phương
thức
không
đồng
bộ
Thread.Sleep(100);
}
// E dR
d
ẽ bị khó h đế khi ử lý khô đồ bộ hà thàh
23
//
E
n
dR
ea
d
s
ẽ
bị
khó
a c
h
o
đế
n
khi
x
ử
lý
khô
ng
đồ
ng
bộ
h
o
à
n
thà
n
h
int numBytes = strm.EndRead(result);
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
•
C llb k
Mdl
•
C
a
llb
ac
k
M
o
d
e
l
− Yêu cầutachỉđịnh phương thứccallbackvàbấtkỳ
trạng
thái
nào
dùng
trong
phương
thức
callback
để
trạng
thái
nào
dùng
trong
phương
thức
callback
để
kết thúc lờigọiphương thức không đồng bộ.
static void TestCallbackAPM(){ static void CompleteRead(IAsyncResult r){
string filename=“…”;
FileStream strm=new ….;
// thực hiện lời gọi không đồng bộ
Console.WriteLine(“Read
Completed”);
FileStream strm=(FileStream)
r AsyncState;
IAsyncResult
result=strm.BeginRead(buffer,0,buf
fer.Length,new
AsyncCallBack(CompleteRead),str
r
.
AsyncState;
int numBytes=strm.EndRead(r);
strm.Close();
ClWitLi()
24
AsyncCallBack(CompleteRead),str
m);
}
C
onso
l
e.
W
r
it
e
Li
ne
(
…
)
;
}
TRƯỜNG ĐẠI HỌC KHOA HỌC TỰ NHIÊN TP.HCM
TRUNG TÂM TIN HỌC
Lập trình không đồng bộ
•
Ngoạilệ và APM
•
Ngoại
lệ
và
APM
− Khi dùng APM, các tác vụ có thể phát sinh các ngoại
lệ trong quá trình xử lý
lệ
trong
quá
trình
xử
lý
− Các ngoại lệ thường phát sinh trong quá trình gọi
phương thức EndXXX.
int numBytes=0;
try{
numBytes=strm EndRead(result);
numBytes=strm
.
EndRead(result);
}
Catch (IOException){
25
Console.WriteLine(“An IO Exception occurred”);
}