многопоточность — двоичный семафор для синхронизации потоков в переполнении стека

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

Так что есть комната для посещений, в которую может войти только один человек. В моем дизайне есть три очереди людей (все темы, которые я создал). Например, после того, как человек во второй очереди посетил эту комнату, следующий человек, который собирается войти в комнату, является главным, ожидающим в третьей очереди, а не человеком первой очереди. Количество всех людей приведено. и после ухода просто прервите поток.

Я пытаюсь создать три семафора для обработки этого, то есть после того, как один человек во второй очереди входит, затем блокирует вторую очередь и ТОЛЬКО «сигнализирует» третью очередь для продолжения. и так далее и тому подобное. Тем не менее, код имеет некоторые проблемы. здесь я просто показываю часть кода семафора.

в основном:

sem_init (&мьютекс, 0, 1);

sem_init (&s0, 0, 1);

sem_init (&s1, 0, 1);

sem_init (&s2, 0, 1);

// создаем 100 pthread и случайным образом помещаем в queue0 или queue1 или queue2

 for(int i = 0; i<num_thread; i++){

pthread_t curr_thread;
if(queueId == 0){
queue0.push(curr_thread);
}else if(queueId == 1){
queue1.push(curr_thread);
}else if(queueId == 2){
queue2.push(curr_thread);
}
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
pthread_create (&curr_thread, &attr, &thread_function, &queue_Num);
pthread_attr_destroy (&attr);

}

в функции потока:

void* thread_function (void* arg){

sem_wait(&mutex);

int n = *((int*) arg);
if(n==0){
sem_wait(&s0);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue0.empty()){
queue0.pop();
}else{
n++;
}
sem_post(&s1);

}else if(n==1){
sem_wait(&s1);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue1.empty()){
queue1.pop();
}else{
n++;
}
sem_post(&s2);
}else if(n==2){
sem_wait(&s2);
cout << "person in queue" << n << " is visiting" << endl;
sleep(1);
if(!queue2.empty()){
queue2.pop();
}else{
n++;
}
sem_post(&s0);
}

sem_post(&mutex);

return NULL;
}

На самом деле, когда я запускаю его, кажется, что я встретил «тупик», основной закончил с показом только 2 потоков каждый раз. Я думал, что должны быть некоторые проблемы при проектировании функции thread_function. Кто-нибудь может помочь указать на это и сказать мне, как это исправить? Спасибо заранее.

2

Решение

Когда вы передаете queueId потокам, вы не хотите передавать ему указатель на одну из ваших локальных переменных, потому что вы собираетесь изменить это очень быстро. Вместо этого вы должны просто передать целое число своим потокам:

pthread_create(&curr_thread, &attr, &thread_function, (void*)queueId);
// Pass queueId the int, not a pointer

Затем, когда вам нужно прочитать значение в ваших темах, просто приведите void* вернуться к целому числу:

void* thread_function (void* arg){
...

int n = (long)arg;

..
}

После этого ваш код отлично работает для меня.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]