каждый.
Я новичок в семафоре, и недавно я учусь реализовывать простую проблему с помощью двоичных семафоров, и у меня есть несколько вопросов.
Так что есть комната для посещений, в которую может войти только один человек. В моем дизайне есть три очереди людей (все темы, которые я создал). Например, после того, как человек во второй очереди посетил эту комнату, следующий человек, который собирается войти в комнату, является главным, ожидающим в третьей очереди, а не человеком первой очереди. Количество всех людей приведено. и после ухода просто прервите поток.
Я пытаюсь создать три семафора для обработки этого, то есть после того, как один человек во второй очереди входит, затем блокирует вторую очередь и ТОЛЬКО «сигнализирует» третью очередь для продолжения. и так далее и тому подобное. Тем не менее, код имеет некоторые проблемы. здесь я просто показываю часть кода семафора.
в основном:
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. Кто-нибудь может помочь указать на это и сказать мне, как это исправить? Спасибо заранее.
Когда вы передаете 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;
..
}
После этого ваш код отлично работает для меня.
Других решений пока нет …