Nội dungGiới thiệu lập trình nhúng và môi trường Linux T1 Xuất nhập và truyền nhận sử dụng IPC T3-4 Thread Xuất nhập trực tiếp thiết bị qua Port T5... Khái niệm Các thread trong
Trang 1LẬP TRÌNH
Email: Tu.NN79@gmail.com
Chương 01:Lập trình C/C++ trên Linux
(P4: Thread)
Trang 2Nội dung
Giới thiệu lập trình nhúng và môi trường Linux
(T1)
Xuất nhập và truyền nhận sử dụng IPC
(T3-4)
Thread
Xuất nhập trực tiếp thiết bị qua Port
(T5)
Trang 3Khái niệm
Trang 4Khái niệm
Các thread trong cùng một process chia sẻ
cùng
mã (text section)
dữ liệu (data section)
Phần mô tả tập tin
Các vùng riêng của mỗi thread
Thread ID
Stack
Thanh ghi
Trang 5Chuẩn về Thread
POSIX (Portable Operating System Interface)
thread hay còn gọi là IEEE 1003.1, 1003.1c
phổ biến trong các hệ thống *NIX hiện tại
đặc tả các giao diện lập trình API và thư viện
user-level thread
Sun Thread
Trang 6POSIX Threads
Khởi tạo thread mới
#include <pthread.h>
int pthread_create (
pthread_t * thread,
pthread_attr_t * attr,
void * (*start_routine)(void *),
Kết quả trả về của hàm
0:
Tạo thread mới thành công
tham số thread chứa thread ID
#0: Thất bại (mã lỗi trả về trong errno)
Trang 7POSIX Threads
Các tham số
thread :
biến con trỏ kiểu pthread_t
chứa ID của thread mới
attr :
chứa các thiết lập thuộc tính cho thread,
nếu tham số attr = NULL thì thiết lập theo giá trị mặc định.
start_routine :
Tham chiếu đến một hàm của user định nghĩa.
Trang 8POSIX Threads
Thread kết thúc thực thi khi
hàm start_routine kết thúc
Có lời gọi hàm pthread_exit() tường minh.
Thread bị ngắt bởi lời gọi hàm pthread_cancel ()
process chính kết thúc
một trong các thread gọi hàm hệ thống exec ()
Lời gọi hàm kết thúc thread tường minh
void pthread_exit (void * retval);
Trang 9File thr1.c
#include <pthread.h>
#include <stdio.h>
void* func(void* arg) {
int i;
for (i = 0; i < 2; i++) {
printf ("This is thread %d\n", *((int*)arg));
sleep (1);
}
}
int main (int argc, char **argv) {
int i;
pthread_t tid[5];
Trang 10Biên dịch và thực thi
$gcc thr1.c -o thr1 – lpthread
$./thr1
(chỉ định liên kết với thư viện POSIX pthread)
This is thread 1026
This is thread 2051
This is thread 3076
This is thread 4101
This is thread 5126
This is thread 1026
This is thread 2051
This is thread 3076
This is thread 4101
This is thread 5126
Trang 11Chờ Threads
PTHREAD_JOIN
#include <pthread.h>
int pthread_join (
pthread_t th,
void **thread_return);
Hàm pthread_join ()
khiến cho thread gọi hàm phải tạm ngưng thực thi
chờ/đợi đến khi thread có chỉ số thread ID kết thúc
Tham số thread_return chứa kết quả trả về(chính là giá trị
Trang 12File thr2.c
#include <pthread.h>
#include <stdio.h>
void* func(void* arg) {
for (int i = 0; i < 2; i++) {
printf ("This is thread %d\n", (int*)arg));
sleep (1);
} }
int main (int argc, char **argv) {
int i;
pthread_t tid[3];
for (i = 0; i < 3; i++){
pthread_create (&tid[i], NULL, func, (void*)&tid[i]);
} return 0;
}
Trang 13struct char_print_parms {
char character;
int count;
};
void* char_print (void* args) {
struct char_print_parms* p = (struct char_print_parms*) args; for (int i = 0; i < p->count; ++i)
printf ("%c", p->character);
return NULL;
}
int main () {
pthread_t tid;
struct char_print_parms th_args;
th_args.character = 'X';
Trang 14Bài tập Threads
Trang 15Q/A