2012-05-03 44 views
10

Do sau:Pthread_create() hoạt động như thế nào?

pthread_t thread; 
pthread_create(&thread, NULL, function, NULL); 
  • Chính xác những gì pthread_create làm để thread?

  • Điều gì sẽ xảy ra với thread sau khi đã tham gia chuỗi chính và đã kết thúc?

  • gì sẽ xảy ra nếu sau khi thread đã tham gia, bạn làm như sau:

    pthread_create(&thread, NULL, another_function, NULL); 
    
+4

Tôi đang bị giảm giá .... tại sao? Đó là một câu hỏi cụ thể về lập trình. –

+1

+1, bạn nên biết chi tiết triển khai. –

+0

Điều tốt về nguồn mở là nguồn mở. Bạn luôn có thể tải xuống mã nguồn của pthread và kiểm tra nó. – mfontanini

Trả lời

5

Chính xác thì pthread_create làm gì cho chuỗi?

thread là một đối tượng, nó có thể giữ giá trị để nhận dạng chuỗi. Nếu pthread_create thành công, nó sẽ điền vào một giá trị xác định chuỗi mới được tạo. Nếu không thành công, thì giá trị của thread sau khi cuộc gọi không được xác định. (tham chiếu: http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_create.html)

Điều gì xảy ra với chuỗi sau khi đã tham gia chuỗi chính và chấm dứt?

Không có gì xảy ra với đối tượng, nhưng giá trị nó giữ không còn đề cập đến chủ đề bất kì (ví dụ như vậy bạn có thể không còn vượt qua nó để chức năng mà phải mất một pthread_t, và nếu bạn vô tình làm sau đó bạn có thể nhận được ESRCH lỗi trở lại).

gì xảy ra nếu, sau khi chủ đề đã tham gia, bạn làm như sau:

Tương tự như trước đây: nếu pthread_create thành công, một giá trị được gán xác định các chủ đề mới được thành lập.

2

pthread_create sẽ tạo ra một chủ đề sử dụng các cuộc gọi hệ điều hành. Những điều tuyệt vời về trừu tượng là bạn không thực sự cần phải quan tâm những gì đang xảy ra bên dưới. Nó sẽ đặt chuỗi biến bằng một mã định danh có thể được sử dụng để tham chiếu đến chuỗi đó. Ví dụ, nếu bạn có nhiều chủ đề và muốn hủy bỏ một trong số họ chỉ cần gọi

pthread_cancel (thread)

bằng cách sử dụng định danh pthread_t quyền chỉ định các chủ đề bạn quan tâm.

Điều gì xảy ra với chuỗi sau khi nó đã tham gia chuỗi chính và bị chấm dứt?

Trước khi chuỗi kết thúc chuỗi var đóng vai trò là khóa/chỉ mục để nhận hoặc xác định chuỗi. Sau khi chủ đề chấm dứt giá trị mà khóa/chỉ mục trỏ đến không còn phải hợp lệ nữa. Bạn có thể giữ nó xung quanh và cố gắng tái sử dụng nó, nhưng đó là gần như chắc chắn gây ra lỗi.

gì xảy ra nếu, sau khi chủ đề đã tham gia, bạn làm như sau:

pthread_create(&thread, NULL, another_function, NULL); 

Không có vấn đề, kể từ khi bạn cung cấp cho nó một tham chiếu cho chủ đề giá trị của chủ đề sẽ được thiết lập để một định danh cho chủ đề mới vừa được tạo. Tôi nghi ngờ rằng nó có thể giống như trước, nhưng tôi sẽ không tin vào nó.

+1

Làm thế nào để bạn biết 'pthread_join' không sửa đổi đối tượng. Vật thể mờ đục. Bạn không thể (và không nên) biết mỗi cuộc gọi này thực hiện đối tượng 'pthread_t' mà bạn truyền vào làm tham số. Tất cả những gì bạn biết là nó được sử dụng để xác định một luồng trong các lệnh 'pthread_ *' khác. –

+0

@Loki, 'pthread_join' nhận đối số' pthread_t' của nó theo giá trị; nó không thể ảnh hưởng đến giá trị của nó. Nó chắc chắn có thể sửa đổi "đối tượng" mà giá trị 'pthread_t' xác định, nhưng đó là một vấn đề riêng biệt, và câu trả lời của Paul chưa bao giờ được đề cập đến. Đó là cách mà 'free' không sửa đổi con trỏ nó được truyền đi. –

+1

@RobKennedy: Bạn đang đưa ra các giả định. Điều gì xảy ra nếu pthread_t là một con trỏ. Sau đó, bạn có thể dễ dàng sửa đổi đối tượng. Nhưng chúng ta đang thiếu điểm. Điểm là ** bạn không biết (và không nên biết) ** những gì các chức năng làm cho đối tượng. Đối tượng là ** mờ đục ** vì một lý do. –

Các vấn đề liên quan