context
// 64kB stack
#define FIBER_STACK 1024*64
#include "ucontext.h"
#include"stdlib.h"
#include "stdio.h"
ucontext_t child, parent;
// The child thread will execute this function
void threadFunction()
{
printf( "Child fiber yielding to parent" );
swapcontext( &child, &parent );
printf( "Child thread exiting\n" );
swapcontext( &child, &parent );
}
#include <unistd.h>
#include <pthread.h>
void* f(void *){
printf( "thread end\n" );
return 0;
}
int main()
{
pthread_t d;
pthread_create(&d,0,f,0);
// Get the current execution context
getcontext( &child );
// Modify the context to a new stack
// child.uc_link = 0;
child.uc_stack.ss_sp = malloc( FIBER_STACK );
child.uc_stack.ss_size = FIBER_STACK;
// child.uc_stack.ss_flags = 0;
if ( child.uc_stack.ss_sp == 0 )
{
perror( "malloc: Could not allocate stack" );
exit( 1 );
}
// Create the new context
printf( "Creating child fiber\n" );
//makecontext( &child, &threadFunction, 0 );
swapcontext( &parent, &child );
printf( "Child fiber returned and stack freed\n" );
sleep(3);
// Execute the child context
printf( "Switching to child fiber\n" );
swapcontext( &parent, &child );
printf( "Switching to child fiber again\n" );
swapcontext( &parent, &child );
sleep(3);
// Free the stack
free( child.uc_stack.ss_sp );
printf( "main end\n" );
return 0;
}
#include "ucontext.h"
#include "stdlib.h"
#include "memory.h"
#include "sys/types.h"
struct Task
{
void *stack;
uint stackSize;
int state;
ucontext_t context;
};
struct ThreadContext
{
Task tasks[5];
};
enum{
unused = 0,
used,
};
void f(int a, int b){
int k = a + b;
++k;
}
int main(int argc, char *argv[])
{
ThreadContext scheduler;
memset(&scheduler, 0, sizeof(scheduler));
Task& mainTask = scheduler.tasks[0];
mainTask.stackSize = 1 << 21;
mainTask.stack = malloc(mainTask.stackSize);
mainTask.state = used;
for (uint i = 1; i < sizeof(scheduler.tasks)/ sizeof(*scheduler.tasks); ++i){
Task& task = scheduler.tasks[i];
// task.stack = 0;
// task.stackSize = 0;
if (getcontext(&task.context))
exit(3);
task.context.uc_stack.ss_sp = mainTask.stack;
task.context.uc_stack.ss_size = mainTask.stackSize;
}
Task& task = scheduler.tasks[1];
makecontext(&task.context, (void (*)())f, 2, 4, 6);
if (swapcontext(&mainTask.context, &task.context))
exit(4);
for (uint i = 0; i < sizeof(scheduler.tasks)/ sizeof(*scheduler.tasks); ++i){
Task& task = scheduler.tasks[i];
if (task.stack)
free(task.stack);
}
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理