Truy cập vào dữ liệu riêng của thread 40 

Một phần của tài liệu nghiên cứu lập trình thread và ứng dụng (Trang 40 - 43)

Sau khi tạo ra một khóa, chúng ta có thể truy cập vào giá trị của chúng bằng cách sử dụng hai hàm: pthread_getspecific() và pthread_setspecific() . Hàm đầu tiên được dùng để lấy giá trị của một khóa được đưa ra còn hàm sau được dùng để thiết lập giá trị của khóa được đưa ra. Giá trị của một khóa chỉ là một con trỏ kiểu void

dụng của những hàm này. Giả sử rằng ‘a_key’ là một biến khởi tạo kiểu pthread_key_t để chứa khóa được tạo ra trước:

/* biến này được sử dụng để lưu giá trị trả về của hàm */ int rc;

/* định nghĩa một biến mà chúng ta sẽ lưu vào đó một vài dữ liệu, ví dụ là 1 số

nguyên */

int* p_num = (int*)malloc(sizeof(int)); if (!p_num) {

fprintf(stderr, "malloc: out of memory\n"; exit(1);

}

/* khởi tạo giá trị */ (*p_num) = 4;

/* bây giờ lưu giá trị này vào khóa */

/* chú ý rằng chúng ta không lưu ‘p_num’ vào khóa */ /* chúng ta chỉ lưu giá trị mà p_num trỏ tới */

rc = pthread_setspecific(a_key, (void*)p_num);

.

/* lấy giá trị của khóa a_key và in ra */ {

int* p_keyval = (int*)pthread_getspecific(a_key); if (p_keyval != NULL) {

printf("value of 'a_key' is: %d\n", *p_keyval); }

}

Chú ý rằng, nếu chúng ta thiết lập giá trị cho khóa trong một thread, và cố thử lấy giá trị trong thread khác, chúng ta sẽ nhận được giá trị NULL, giá trị này là khác biệt cho mỗi thread. Cũng có hai trường hợp mà hàm pthread_getspecific() trả về NULL:

- Khóa được cung cấp như tham số không hợp lệ ( ví dụ như khóa chưa được tạo).

- Giá trị của khóa là NULL. Điều này có thể là nó chưa được khởi tạo, hoặc được đặt là NULL bởi lời gọi pthread_setspecific() trước.

2.5.4. Xóa dữ liệu trong thread

Hàm pthread_key_delete() có thể được dùng để xóa khóa. Nhưng không được nhầm lẫn với tên của hàm này: nó không xóa được vùng nhớ liên quan tới khóa, cũng không gọi hàm hủy được định nghĩa trong khi khóa được tạo ra. Vì vậy, vẫn cần giải phóng vùng nhớ nếu cần thiết.

Sử dụng hàm này rất đơn giản. Giải sử list_key là một biến kiểu pthread_key_t trỏ tới một khóa đã được tạo, sử dụng hàm này như sau:

Int rc = pthread_key_delete(key);

CHƯƠNG 3: BÀI TOÁN CLOSEST_PAIR TRONG KHÔNG GIAN HAI

CHIỀU SỬ DỤNG MULTITHREADING

Một phần của tài liệu nghiên cứu lập trình thread và ứng dụng (Trang 40 - 43)