Giáo trình Lập trình An toàn - Chương 3: Kiểm soát xung đột Synchronization Technique - Lương Ánh Hoàng
Event dùng đồng bộ hoạt động của các luồng thông qua cơ chế báo
hiệu.
§ Sử dụng
§ Khai báo: HANDLE hEvent;
§ Khởi tạo: hMutex = CreateEvent(NULL, TRUE, FALSE, “MyEvent”)
§ Sử dụng
WaitForSingleObject(hEvent, INFINITE)
//
SetEvent(hEvent)
ResetEvent(hEvent)
// // Báo hiệu các luồng khác
// Chặn các luồng khác
CloseHandle(hEvent)
§ Ví dụ
3.5 Event
9 trang |
Chia sẻ: huongthu9 | Lượt xem: 649 | Lượt tải: 0
Bạn đang xem nội dung tài liệu Giáo trình Lập trình An toàn - Chương 3: Kiểm soát xung đột Synchronization Technique - Lương Ánh Hoàng, để tải tài liệu về máy bạn click vào nút DOWNLOAD ở trên
Lương
Ánh
Hoàng
hoangla@soict.hut.edu.vn
Chương
3.
Kiểm
soát
xung
đột
Synchronization
Technique
3.1
Khái
niệm
3.2
Đoạn
găng
(Critical
Section).
3.3
Đèn
hiệu
(Semaphore)
3.4
Mutex
3.5
Event
3.6
SRW
Lock
Nội
dung
47
§ Xung
đột
là
vấn
đề
phát
sinh
khi
nhiều
luồng
của
chương
trình
chạy
trên
bộ
vi
xử
lý
đa
nhân
cùng
truy
nhập
một
tài
nguyên
hệ
thống.
§ Ví
dụ
3.1
Khái
niệm
48
int
x
=
0;
DWORD
WINAPI
Thread(LPVOID
lpParam)
{
for
(int
i=0;i<2000000;i++)
x++;
return
0;
}
int
_tmain(int
argc,
_TCHAR*
argv[])
{
HANDLE
hThread1
=
CreateThread(NULL,NULL,Thread,NULL,NULL,NULL);
HANDLE
hThread2
=
CreateThread(NULL,NULL,Thread,NULL,NULL,NULL);
WaitForSingleObject(hThread1,INFINITE);
WaitForSingleObject(hThread2,INFINITE);
printf("X=%d",x);
getch();
return
0;
}
§ Đoạn
găng
(Critical
Section)
là
đoạn
chương
trình
được
bảo
vệ
bởi
hệ
điều
hành
sao
cho
tại
mọi
thời
điểm
chỉ
có
một
luồng
được
phép
thực
thi.
§ Sử
dụng
§ Khai
báo:
CRITICAL_SECTION
cs
§ Khởi
tạo:
InitializeCriticalSection(&cs)
§ Sử
dụng
EnterCriticalSection(&cs)
//
Bắt
đầu
đoạn
găng
//
Kết
thúc
đoạn
găng
LeaveCriticalSection(&cs)
//
DeleteCriticalSection(&cs)
§ Ví
dụ
§ Đặc
điểm:
chỉ
có
tác
dụng
trong
cùng
một
tiến
trình
3.2
Đoạn
găng
49
§ Đèn
hiệu
(Semaphore)
dùng
để
giới
hạn
số
lượng
luồng
tối
đa
được
phép
thực
thi
cùng
một
đoạn
chương
trình.
§ Sử
dụng
§ Khai
báo:
HANDLE
hSemaphore
§ Khởi
tạo:
hSemaphore
=
CreateSemaphore(NULL,5,5,NULL)
§ Sử
dụng
WaitForSingleObject(hSemaphore,
0L)
//
//
ReleaseSemaphore(hSemaphore,1,NULL)
//
CloseHandle(hSemaphore)
§ Ví
dụ
§ Đặc
điểm
§ Dùng
chung
được
giữa
các
tiến
trình
§ Tốc
độ
chậm
hơn
CRITICAL_SECTION
3.3
Đèn
hiệu
50
§ Mutex
dùng
để
bảo
vệ
tài
nguyên
của
chương
trình,
tại
một
thời
điểm
chỉ
cho
phép
một
luồng
của
một
tiến
trình
truy
nhập.
§ Sử
dụng
§ Khai
báo:
HANDLE
hMutex;
§ Khởi
tạo:
hMutex
=
CreateMutex(NULL,
FALSE,
NULL)
§ Sử
dụng
WaitForSingleObject(hMutex,
INFINITE)
//
//
ReleaseMutex(hMutex)
§ Ví
dụ
§ Đặc
điểm
§ Chậm
hơn
CRITICAL_SECTION
§ Có
thể
đồng
bộ
giữa
các
tiến
trình
3.4
Mutex
51
§ Event
dùng
đồng
bộ
hoạt
động
của
các
luồng
thông
qua
cơ
chế
báo
hiệu.
§ Sử
dụng
§ Khai
báo:
HANDLE
hEvent;
§ Khởi
tạo:
hMutex
=
CreateEvent(NULL,
TRUE,
FALSE,
“MyEvent”)
§ Sử
dụng
WaitForSingleObject(hEvent,
INFINITE)
//
SetEvent(hEvent)
//
Báo
hiệu
các
luồng
khác
ResetEvent(hEvent)
//
Chặn
các
luồng
khác
//
CloseHandle(hEvent)
§ Ví
dụ
3.5
Event
52
§ SRW
Lock
(Slim
Reader
Writer
Lock
)dùng
đồng
bộ
hoạt
động
của
các
luồng
thông
tương
tự
như
đoạn
găng
§ Sử
dụng
§ Khai
báo:
SRWLOCK
lock;
§ Khởi
tạo:
InitializeSRWLock(&lock);
§ Sử
dụng
AcquireSRWLockShared(&lock)
AcquireSRWLockExclusive(&lock)
//
//
ReleaseSRWLockShared(&lock)
ReleaseSRWLockExclusive(&lock)
§ Ví
dụ
3.5
SRW
Lock
53
1. Viết
chương
trình
chat
Client
và
Server
với
kênh
truyền
đã
mã
hóa
bằng
thuật
toán
AES-‐256,
sử
dụng
thư
viện
OpenSSL
và
CryptoAPI.
Mật
khẩu
mã
hóa
là
:
123456.
Việc
mã
hóa
và
việc
nhận
dữ
liệu
được
thực
hiện
đồng
thời
trên
2
luồng
riêng
biệt,
sử
dụng
cơ
chế
đồng
bộ
CRITICAL_SECTION
2. Viết
chương
trình
mã
hóa
và
giải
mã
tệp
tin
theo
thuật
toán
AES-‐256,
với
tên
nhập
từ
bàn
phím,
mật
khẩu
mã
hóa
là
:nopass.
Sử
dụng
thư
viện
OpenSSL
và
CryptoAPI
Bài
tập
54
Các file đính kèm theo tài liệu này:
- giao_trinh_lap_trinh_an_toan_chuong_3_kiem_soat_xung_dot_syn.pdf