sách gpt4 ai đã đi

Chuyển đổi kiểu từ void*(*)(void*) sang void(*)(void)

In lại Tác giả: Space Dog Thời gian cập nhật: 2023-10-29 15:16:29 32 4
mua khóa gpt4 Nike

Là một phần của bài tập về nhà, tôi đang cố gắng tạo một thư viện luồng cấp người dùng giống như pthreads.

Để xử lý việc chuyển đổi ngữ cảnh giữa các luồng, tôi đã sử dụng hàm "swapcontext". Trước khi sử dụng, tôi phải tạo ngữ cảnh bằng hàm "makecontext". 'makecontext' yêu cầu một kiểu trả về là vô hiệu và kiểu tham số là (vô hiệu) Con trỏ hàm.

Kiểu hàm luồng phải là void* hàm_thread (void*)

Có cách nào để chuyển đổi kiểu dữ liệu không? Hoặc có cách nào khác để chuyển đổi ngữ cảnh ở cấp độ người dùng không?

1 Câu trả lời

Việc gọi một hàm có nguyên mẫu không tương thích bằng cách ép địa chỉ của hàm sang một nguyên mẫu khác và gọi nó thông qua con trỏ kết quả là bất hợp pháp:

void *my_callback(void *arg) { ... }

void (*hỏng)(void *) = (void (*)(void *)) my_callback;
broken(some_arg); // không đúng, my_callback trả về `void *`

Những gì bạn có thể làm là chuyển cuộc gọi lại của riêng bạn tới tạo bối cảnh, sẽ gọi chức năng luồng Và bỏ qua giá trị trả về của nó. Các hàm nhỏ chỉ được sử dụng để gọi một hàm khác đôi khi được gọi bạt nhún. .

/* kiểu trả về tương thích với nguyên mẫu của lệnh gọi lại đã nhận
bằng makecontext; chỉ cần gọi hàm gọi lại thực sự */
static void trampoline(int cb, int arg)
{
void *(*real_cb)(void *) = (void *(*)(void *)) cb;
void *real_arg = arg;
real_cb(đối_số_thực);
}

int my_pthread_create(void *(*cb)(void *), void *arg)
{
ucontext_t *ucp;
...
/* Để ngắn gọn, hãy coi `void *` có cùng kích thước với `int` -
KHÔNG SỬ DỤNG NGUYÊN TRẠNG.
makecontext phơi bày một API khó chịu và bất tiện chỉ
chấp nhận các đối số int; mã đúng sẽ giải mã từng đối số
con trỏ vào hai số nguyên (trên các kiến ​​trúc mà con trỏ là
lớn hơn int) và tái tạo chúng trên tấm bạt lò xo. */
makecontext(ucp, trampoline, 2, (int) cb, (int) arg);
...
}

Để có điểm thưởng, bạn có thể sửa đổi tấm bạt lò xo để trả lại trống rỗng * Giá trị được lưu trữ trên ngăn xếp và cho phép bạn pthread_join() Lấy lại nó.

Liên quan đến C - Chuyển đổi void*(*)(void*) thành void(*)(void), chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/14530109/

32 4 0
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com