gpt4 book ai didi

multithreading - sem_init() 导致 SEGV

转载 作者:行者123 更新时间:2023-12-04 08:26:52 28 4
gpt4 key购买 nike

我有以下代码,它被 SEGV 信号杀死。使用调试器表明它被 main() 中的第一个 sem_init() 杀死。如果我注释掉第一个 sem_init() ,第二个会导致同样的问题。我试图弄清楚是什么导致这个系统调用导致 SEGV。 else 没有运行,所以在返回值之前就发生了错误。任何帮助将不胜感激,谢谢。

我删除了在此问题发生之前未运行的其余代码。

#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");

最佳答案

您声明指向信号量的指针:

sem_t* available_threads;
sem_t* waiting_jobs;

但从不初始化内存。 sem_init 函数不期望分配内存,只是为了初始化现有的内存块。要么分配一些内存并将这些指针分配给它,要么将信号量声明为 sem_t 并将地址传递给 sem_init

关于multithreading - sem_init() 导致 SEGV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7871276/

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