gpt4 book ai didi

c - 为什么 makecontext/swapcontext 不适用于 pthread_mutex_lock/pthread_mutex_unlock

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:33 28 4
gpt4 key购买 nike

我已成功使用 ma​​kecontext/swapcontext 移动堆栈。但是,当我尝试将它与 pthread_mutex_lockpthread_mutex_unlock 一起使用时,我总是收到段错误。任何想法,为什么会这样。代码如下所示。

编辑

现在我阅读了 swapcontext 手册,

由于当前 pthread 实现的限制,makecontext 不应在链接到 pthread(3) 库(无论是否使用线程)的程序中使用。

有解决办法吗?

static const unsigned int SWAP_STACK_SIZE = 8192;
// These are globally defined variables.
// Since each thread will have its own stack, they are defined as arrays.
static ucontext_t uctx_main[8], uctx_func[8];
static char func_stack[8][SWAP_STACK_SIZE];

// tid is thread ID here, values are 0, 1, 2, 3, etc...
if (getcontext(&uctx_func[tid]) == -1)
handle_error("getcontext");
uctx_func[tid].uc_stack.ss_sp = func_stack[tid];
uctx_func[tid].uc_stack.ss_size = SWAP_STACK_SIZE;
uctx_func[tid].uc_link = &uctx_main[tid];
makecontext(&uctx_func[tid], (void(*)())pthread_mutex_unlock, 1, &mutex);

if (swapcontext(&uctx_main[tid], &uctx_func[tid]) == -1)
handle_error("swapcontext");

最佳答案

手册页指出 makecontext 将参数作为 int 类型传递。如果您使用的是 64 位 Linux,那么指针将是 64 位,而 int 将是 32 位,奇怪的事情就会开始发生。

关于c - 为什么 makecontext/swapcontext 不适用于 pthread_mutex_lock/pthread_mutex_unlock,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8167143/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com