ошибка сегментации в setcontext

Я провожу тест на то, как планировщик планирует ожидающий поток, и в процессе я хочу, чтобы ОС не видела ожидающий поток, поэтому я убиваю поток, ожидающий блокировки, и запускаю его, когда блокировка снята. , я думаю, что мне следует сохранить контекст потока перед выходом и восстановить его, когда я создам его снова. Явно что-то делаю не так, но не могу понять. (Я очень новичок в этом вопросе.)

пока это мой код, он генерирует ошибку сегментации с помощью setcontext.

#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <ucontext.h>

ucontext_t data;
pthread_t pth;
pthread_mutex_t lock1;

void* wake_up(void* arg) {
    printf("going to wake up a thread\n");
    setcontext(&data);
}
void MUTEX_UNLOCK(pthread_mutex_t* lock) {
    pthread_mutex_unlock(lock);
    pthread_create(&pth, NULL, wake_up, NULL);
}
void MUTEX_LOCK(pthread_mutex_t* lock) {    

    getcontext(&data);

    while(1) {      
        if(pthread_mutex_trylock(lock) == 0) {
            printf("got the lock\n");
            break;
        }
        else {              
            printf("going to exit thread\n");
            pthread_exit(NULL);
        }
    }
}

void* routine1(void* param) {
    MUTEX_LOCK(&lock1);
    printf("enter any character to continue\n");
    getchar();
    MUTEX_UNLOCK(&lock1);
}

int main(int argc, char** argv) {

    pthread_mutex_init(&lock1, 0);

    pthread_t thread1[2];  
    int i; 
    for (i = 0; i < 2; i++)
        pthread_create(&thread1[i], NULL, routine1, NULL);  

    while(1);
}

person zmeftah    schedule 31.07.2015    source источник
comment
КАКИЕ? Потоки не прерываются/не воссоздаются при блокировке мьютекса!   -  person Martin James    schedule 31.07.2015
comment
Вы можете получить ошибку сегментации, потому что данные (глобальная переменная) не инициализированы, поэтому каждое из его полей содержит информацию о мусоре.   -  person Damián Montenegro    schedule 31.07.2015
comment
@DamiánMontenegro: статические объекты всегда инициализируются, возможно, не так, как вы хотите.   -  person EOF    schedule 31.07.2015
comment
Я согласен, моя вина. Я хотел сказать то, что ты говоришь. Мне жаль.   -  person Damián Montenegro    schedule 31.07.2015
comment
@MartinJames: конечно, нет, причина, по которой я это делаю, в том, что я хочу скрыть свою ветку от ОС   -  person zmeftah    schedule 31.07.2015
comment
@DamiánMontenegro: getcontext(&data) не инициализирует данные для меня?   -  person zmeftah    schedule 31.07.2015


Ответы (1)


setcontext недействителен при установке контекста завершенного потока. (Указатель стека указывает на стек, который был освобожден.) Вот почему вы получаете сбой.

В целом, getcontext и setcontext являются устаревшими и чрезвычайно странными функциями, которые не следует использовать, если только у вас нет особых потребностей в совместной (не pthreads) многопоточности. Хотя вы не описали, что вы пытаетесь сделать, я на 99% уверен, что вам не нужно setcontext для этого.

person Sneftel    schedule 31.07.2015
comment
Я хочу, чтобы планировщик/ОС не видели мой поток, что я могу сделать в этом случае? можно ли сделать копию стека до его освобождения? - person zmeftah; 31.07.2015
comment
Вы не можете запретить ОС видеть ваш поток. ОС — это то, что управляет вашим потоком. - person Sneftel; 31.07.2015