sem_init () вызывает SEGV - PullRequest
       12

sem_init () вызывает SEGV

3 голосов
/ 24 октября 2011

У меня есть следующий код, и он прерывается сигналом SEGV. Использование отладчика показывает, что он уничтожается первым sem_init () в main (). Если я закомментирую первый sem_init (), второй вызовет ту же проблему. Я попытался выяснить, что может вызвать этот вызов sys вызвать SEGV. Остальное не запускается, поэтому ошибка происходит до того, как она может вернуть значение. Любая помощь будет принята с благодарностью, Спасибо.

Я удалил остальную часть кода, который не запускается до возникновения этой проблемы.

#define PORTNUM 7000
#define NUM_OF_THREADS 5
#define oops(msg) { perror(msg); exit(1);}
#define FCFS 0
#define SJF 1;

void bindAndListen();
void acceptConnection(int socket_file_descriptor);
void* dispatchJobs(void*);
void* replyToClient(void* pos);

//holds ids of worker threads
pthread_t threads[NUM_OF_THREADS];

//mutex variable for sleep_signal_cond
pthread_mutex_t sleep_signal_mutex[NUM_OF_THREADS];
//holds the condition variables to signal when the thread should be unblocked
pthread_cond_t sleep_signal_cond[NUM_OF_THREADS];

//mutex for accessing sleeping_thread_list
pthread_mutex_t sleeping_threads_mutex = PTHREAD_MUTEX_INITIALIZER;
//list of which threads are sleeping so they can be signaled and given a job
std::vector<bool> *sleeping_threads_list = new std::vector<bool>();

//number of threads ready for jobs
sem_t* available_threads;
sem_t* waiting_jobs;


//holds requests waiting to be given to one of the threads for execution
std::vector<std::vector<int> >* jobs = new std::vector<std::vector<int> >();

pthread_mutex_t jobs_mutex = PTHREAD_MUTEX_INITIALIZER;




int main (int argc, char * const argv[]) {

//holds id for thread responsible for removing jobs from ready queue and assigning them to worker thread
pthread_t dispatcher_thread;


//initializes semaphores
    if(sem_init(available_threads, 0, NUM_OF_THREADS) != 0){          //this is the line causing the SEGV
        oops("Error Initializing Semaphore");
    }

    if(sem_init(waiting_jobs, 0, 0) !=0){
        oops("Error Initializing Semaphore");
    }


//initializes condition variables and guarding mutexes
for(int i=0; i<NUM_OF_THREADS; i++){
    pthread_cond_init(&sleep_signal_cond[i], NULL);
    pthread_mutex_init(&sleep_signal_mutex[i], NULL);
}




if(pthread_create(&dispatcher_thread, NULL, dispatchJobs, (void*)NULL) !=0){
    oops("Error Creating Distributer Thread");

1 Ответ

5 голосов
/ 24 октября 2011

Вы объявляете указатели на свои семафоры:

sem_t* available_threads;
sem_t* waiting_jobs;

но никогда не инициализируйте память. Функция sem_init не ожидает выделять память, только для инициализации существующего большого объема памяти. Либо выделите некоторую память и присвойте ей эти указатели, либо объявите семафоры как sem_t и передайте адрес sem_init.

...