Chỉnh sửa: Điều này đang được tăng hạng, vì vậy tôi muốn thêm làm rõ cho hậu thế. Đây không phải là cách hay để giải quyết vấn đề này - bạn sẽ không bao giờ muốn thực hiện việc này bằng tay. Chủ đề người dùng hợp tác là tốt đẹp, và có thể được sử dụng để thực hiện những điều thông minh như coroutines, nhưng nếu bạn muốn làm điều đó bạn nên sử dụng một thư viện như libcoroutine xử lý các bit lông cho bạn. Tuy nhiên, mặc dù đây không phải là giải pháp thiết thực nhưng nó vẫn là một ý tưởng thú vị và là một ví dụ thú vị về lập kế hoạch và những hạn chế của C99 thuần túy.
Đây là câu trả lời không tốt. Tuy nhiên, nó là nền tảng độc lập, và hơn thế nữa, chỉ sử dụng các hàm được định nghĩa trong tiêu chuẩn C99.
Mặt khác, nó nâng cấp CPU (không có chức năng sleep
trong C99, vì vậy chúng tôi phải bận), sử dụng những gì tôi chỉ có thể gọi phép thuật để đặt chỗ trên ngăn xếp và hoàn toàn lạm dụng setjmp
. Nó thậm chí còn sử dụng các biến toàn cầu! Tuy nhiên, nó hoạt động.
Kỹ thuật này được đặt tên là chủ đề người dùng hợp tác, còn gọi là sợi. Tôi đã thực hiện nó, như tôi đã đề cập, sử dụng setjmp
và longjmp
. context_switch
lập lịch trình Round Robin đơn giản.
Đây là mã:
#include <stdio.h>
#include <setjmp.h>
#include <time.h>
static jmp_buf jmp[2];
static int cur;
void context_switch()
{
/* sleep(1) */ /* C99 doesn't have any sleeping functions */
if (!setjmp(jmp[cur])) {
if ((sizeof(jmp)/sizeof(*jmp)) == ++cur)
cur = 0;
longjmp(jmp[cur], 1);
}
}
void fun2()
{
char cushion[1000]; /* reserve some stack space */
time_t old_time, new_time;
cushion[0] = '@'; /* don't optimize my cushion away */
old_time = time(NULL);
cur = 1; /* the first thread to context switch is this one */
setjmp(jmp[1]);
while (1) {
context_switch();
new_time = time(NULL);
if ((new_time - old_time) > (2 * 60)) {
old_time = new_time;
printf("Printed every 2 minutes\n");
}
}
}
void fun1()
{
char cushion[1000]; /* reserve some stack space */
time_t old_time, new_time;
cushion[0] = '@'; /* don't optimize my cushion away */
if (!setjmp(jmp[0]))
fun2();
old_time = time(NULL);
while (1) {
context_switch();
new_time = time(NULL);
if ((new_time - old_time) > (1 * 60)) {
old_time = new_time;
printf("Printed every 1 minute\n");
}
}
}
int main(int argc, char **argv)
{
fun1();
return 0;
}
Và đây là kết quả tôi nhận được:
$ gcc -ggdb -std=c99 -o silly silly_setjmp.c
$ ./silly
Printed every 1 minute
Printed every 2 minutes
Printed every 1 minute
Printed every 1 minute
...
tạo chủ đề riêng biệt với kích hoạt hẹn giờ xuất hiện trong tâm trí của tôi. bạn không thể làm điều đó trong tiêu chuẩn C mà không cần sự giúp đỡ của hệ điều hành – Donotalo
Vì vậy, những gì bạn muốn là cho fun1 để chạy mỗi phút và fun2 để chạy mỗi 2 phút? Và ý của bạn là để chúng hoạt động, hay bạn muốn các quá trình riêng biệt, như câu hỏi của bạn ngụ ý? Cuối cùng, hệ điều hành nào? – cha0site
Vui lòng đọc [this] (http://en.wikipedia.org/wiki/Scheduling_ (computing)) để biết tổng quan về lịch trình là gì? –