Hủy Thread (canceling thread)
Một thread sau khi được tạo ra sẽ thực thi công việc của mình cho đến khi nó kết thúc bằng cách gọi pthread_exit() hoặc return từ hàm bắt đầu của mình. Tuy nhiên, trong một số trường hợp lập trình viên có thể muốn hủy thread đó, nghĩa là yêu cầu thread kết thúc ngay thay vì chờ thread kết thúc theo một trong hai cách trên. Ví dụ, khi có một nhóm vài thread cùng chạy trong tiến trình, có 1 thread phát hiện ra lỗi nào đó và có thể muốn kết thúc các thread khác ngay lúc đó vì việc chạy của các thread bây giờ là vô nghĩa.
Posix thread cung cấp API để gửi yêu cầu hủy một thread là pthread_cancel() với prototype như sau:
#include <pthread.h>
int pthread_cancel(pthread_t thread);
/*Trả về 0 khi thành công, hoặc 1 số dương error number khi lỗi*/
Khi một thread bị hủy bởi hàm pthread_cancel(), hệ thống sẽ tiến hành dọn dẹp và giải phóng dữ liệu trước khi kết thúc thread đó. Cơ chế thread bị hủy sau khi gọi pthread_cancel() phụ thuộc vào 2 thuộc tính trạng thái hủy và loại hủy (cancelability state và cancelability type) của thread đó. Hai thuộc tính này có thể được thiết lập bởi 2 API sau:
#include <pthread.h>
int pthread_setcancelstate(int state, int *oldstate);
int pthread_setcanceltype(int type, int *oldtype);
/*Trả về 0 khi thành công, hoặc 1 số dương error number khi lỗi*/
Hàm pthread_setcancelstate() thiết lập trạng thái hủy của thread với đối số “state” có thể là PTHREAD_CANCEL_DISABLE (không thể bị hủy, thường được truyền tạm thời khi thread đó cần phải thực thi hết 1 lượt các bước) hoặc PTHREAD_CANCEL_ENABLE (trạng thái mặc định của Linux, thread có thể bị hủy); trạng thái hủy cũ của thread được lưu vào biến có địa chỉ “oldstate” (oldstate có thể truyền vào NULL nếu không muốn quan tâm).
Nếu 1 thread được thiết lập có thể hủy, thread có thể bị hủy bất kỳ lúc nào hoặc chờ đến 1 điểm cụ thể tùy thuộc vào cờ cancelability type, cờ này có 1 trong 2 giá trị sau:
- PTHREAD_CANCEL_ASYNCHRONOUS: thread có thể bị hủy bất kỳ lúc nào
- PTHREAD_CANCEL_DEFERRED: thread không bị hủy ngay mà chờ đến khi thread thực thi đến 1 điểm hủy (cancellation point)
Điểm hủy thread là 1 tập hợp các hàm được quy định bởi tiêu chuẩn của POSIX, các hàm này được coi là an toàn cho thread khi bắt đầu quá trình hủy thread đó. Có thể xem danh sách các hàm điểm hủy của tiến trình ở link sau đây:
http://man7.org/linux/man-pages/man7/pthreads.7.html