Я успешно использовал makecontext / swapcontext для сдвига стека.Однако, когда я пытаюсь использовать его с pthread_mutex_lock или pthread_mutex_unlock , я всегда получаю ошибку сегментации.Любая идея, почему это так.Код показан ниже.
EDIT
Теперь я читаю из руководства по 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");