2009-08-29 35 views
24

Đầu mục chức năng cho pthread_create trông như thế này:Tại sao start_routine cho pthread_create trở void * và mất void *

int pthread_create(pthread_t * thread, 
        const pthread_attr_t * attr, 
        void * (*start_routine)(void *), 
        void *arg); 

Tôi hiểu tất cả ngoại trừ việc con trỏ hàm cho start_routine có dạng void* (*fpointer) (void*) có nghĩa là nó lấy một con trỏ void void và trả về một con trỏ void void.

Con trỏ void mà nó cần chỉ là một cách để vượt qua trong một đối số cho start_routine, tôi nhận được phần đó, nhưng tôi không hiểu tại sao hàm trả về một con trỏ void? Mã nào thậm chí sẽ nhận thấy con trỏ void đó?

Trả lời

27

Từ tài liệu cho pthread_create:

Các chủ đề được tạo ra thực hiện start_routine với arg như là đối số duy nhất của nó. Nếu start_routine trả về, hiệu ứng như thể có một lời gọi ngầm đến pthread_exit() bằng cách sử dụng giá trị trả về của start_routine làm trạng thái thoát. Lưu ý rằng chuỗi trong đó main() ban đầu được gọi khác với điều này. Khi nó trả về từ main(), hiệu ứng là như thể có một cuộc gọi ngầm để thoát() bằng cách sử dụng giá trị trả về của main() làm trạng thái thoát.

pthread_exit:

Các pthread_exit() chức năng chấm dứt các thread kêu gọi và làm cho các giá trị value_ptr sẵn cho bất kỳ thành công tham gia với các chủ đề chấm dứt.

Vì vậy, nếu bạn thực hiện lệnh pthread_join trên luồng, con trỏ nó trả về sẽ được chuyển về chuỗi nối, cho phép bạn truyền thông tin từ chuỗi chết sang chuỗi khác, chuỗi đang hoạt động.

7

Từ spec:

Nếu start_routine lợi nhuận, hiệu quả là như thể có một tiềm ẩn cuộc gọi đến pthread_exit() sử dụng giá trị trở lại của start_routine như tình trạng thoát.