Tải bản đầy đủ (.pdf) (33 trang)

nền tảng lập trình c bài 10 threading

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (342.84 KB, 33 trang )

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

thể
cho
bộ
xử

tiếp
tục
thực
với
threading,
ta

thể
cho
bộ
xử


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




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



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

thời
gian
xử

ThreadStart op=new
ThreadStart(SimpleWork);
Thread[] myThreads=new Thread[5];
việc


thời
gian
xử

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



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

loại
bỏ

vĩnh
viễn
Tạm
dừng

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

EndXXX
cấp
phương
thức
BeginXXX


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



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ử



đã


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ử



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




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ệ



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ử


− 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”);
}

×