Почему makecontext / swapcontext не работает с pthread_mutex_lock / pthread_mutex_unlock - PullRequest
0 голосов
/ 17 ноября 2011

Я успешно использовал 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");

1 Ответ

1 голос
/ 17 ноября 2011

Страница руководства гласит, что makecontext передает аргументы как тип int. Если вы используете 64-битный Linux, тогда указатели будут 64-битными, а int - 32-битными, и начнут происходить странные вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...