Chương 4. Luồng<br />
Phạm Quang Dũng<br />
http://fita.hua.edu.vn/pqdung<br />
<br />
4.1. Tạo luồng<br />
<br />
<br />
Mỗi luồng trong 1 tiến trình được xác định bởi 1 thread ID.<br />
<br />
<br />
<br />
Trong C/C++, để dùng thread ID, sử dụng kiểu pthread_t<br />
<br />
<br />
<br />
Chương trình có thể truyền tham số cho luồng mới và lấy dữ<br />
liệu từ luồng qua giá trị trả về.<br />
<br />
<br />
<br />
Sử dụng hàm pthread_create<br />
<br />
2<br />
<br />
Các tham số của hàm pthread_create<br />
1. Một con trỏ tới biến kiểu pthread_t chứa ID của luồng mới.<br />
2. Một con trỏ tới đối tượng thread attribute. Đối tượng này điều<br />
khiển chi tiết việc tiến trình tương tác với phần còn lại của<br />
chương trình. Nếu truyền thread attribute là NULL, luồng mới sẽ<br />
có các thuộc tính mặc định.<br />
3. Một con trỏ tới hàm thread, là hàm bình thường có kiểu:<br />
void* (*) (void*)<br />
4. Một giá trị thread argument có kiểu void*. Bạn truyền bất kể cái<br />
gì cũng đơn giản là tham số cho hàm thread khi luồng bắt đầu<br />
thực hiện.<br />
<br />
3<br />
<br />
<br />
<br />
Lời gọi pthread_create trở về ngay lập tức,<br />
<br />
<br />
<br />
luồng ban đầu thực hiện tiếp các lệnh sau lời gọi<br />
<br />
<br />
<br />
trong khi đó, luồng mới bắt đầu thực hiện hàm<br />
thread.<br />
<br />
<br />
<br />
Linux lập lịch cả 2 luồng theo cách không đồng bộ<br />
<br />
<br />
<br />
Chương trình của bạn phải không phụ thuộc vào thứ<br />
tự thực hiện của các luồng.<br />
<br />
4<br />
<br />
Ví dụ<br />
<br />
<br />
Listing 4.1 (thread-create.c): tạo 1 luồng in các ký tự<br />
‘x’; sau khi gọi pthread_create, luồng chính in các<br />
ký tự ‘o’.<br />
<br />
<br />
<br />
kết quả chạy chương trình?<br />
<br />
<br />
<br />
Lý do: Linux luân phiên lập lịch 2 luồng<br />
<br />
5<br />
<br />