Sự khác biệt giữa pthread *p và pthread p

Các bậc tiền bối cho em hỏi về pthread với ạ.
E có 2 chương trình:

#include "pthread.h"
int main(){
     pthread_t *p = NULL;
     p = (pthread_t*)malloc(sizeof(pthread_t));
     pthread_create(p,NULL,NULL,NULL);
     pthread_join(*p,NULL);
}

#include "pthread.h"
int main(){
     pthread_t p;
     pthread_create(&p,NULL,NULL,NULL);
     pthread_join(p,NULL);
}

cho e hỏi là việc tạo thread = 1 pointer với việc tạo 1 thread bằng 1 variable thì khác nhau như nào ạ. E cám ơn ạ.

Khác nhau dễ thấy nhất là ở chỗ khởi tạo (malloc), ở chỗ sử dụng (p vs *p) và ở chỗ hủy (free <= bạn quên chỗ này)

Còn sâu xa hơn chút thìcũng giống như khác nhau giữa biến thường và con trỏ thôi, nói chuyên môn là khác nhau ở storage duration.

9 Likes

Vâng e cám ơn a ạ, e thiếu phần free. Vậy cho e hỏi: Bình thường khi biến được khai báo trong { } thì hết { } biến đó coi như được huỷ bỏ và vùng nhớ được cấp phát cho biến đó sẽ được ghi đè. Giả sử e khai khởi tạo 1 pthread_t p; sau đó e pthread_detach(p) và hàm để chạy thread có chứa while(true), như vậy ở hàm khởi tạo thread thì vùng nhớ p đã được huỷ bỏ nhưng thread đó vẫn chạy. Liệu có sự khác biệt khi e sử dụng với pthread_t *p không ạ.

Ở chỗ này, phải hiểu là biến pthread_t p chỉ để cho hàm khởi tạo có thông tin để quản lý và tương tác với thread mà thôi. Còn các dữ liệu cần thiết để cho thread có thể chạy nằm ở chỗ khác rồi.
Nên khi bạn gọi pthread_dettach, thì ở hàm khởi tạo muốn nói rằng tôi không muốn quản lý thread được sinh ra nữa, nên biến p lúc này có thể được hủy mà không ảnh hưởng gì đến thread kia cả.

6 Likes

Vâng e cám ơn a đã thông não e ạ.
Mong Mod hoặc Admin đi qua close lại topic dùm e ạ

Thông não rồi thì tick solution là được. Không cần close topic. Sau này có người khác có ý kiến khác vô comment được nữa. Vì chưa chắc @Stanley00 đã đúng 100%

3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?