每个人。我是信号量的新手,最近我正在学习使用二进制信号量来实现一个简单的问题,我有一些问题。
所以有一个会客室,一次只能一个人进去。在我的设计中,有三个人队列(这是我创建的所有线程)。例如,在第二个队列中的人访问了那个房间后,下一个要进入房间的人是第三个队列中的最前面的人,而不是第一个队列的人。给出了总人数。离开后,只需简单地终止线程。
我正在尝试创建三个信号量来处理此问题,即,在第二个队列中的一个人进入后,然后阻止第二个队列并且仅“发出信号”第三个队列继续。依此类推。但是,代码存在一些问题。在这里,我只展示代码的一些信号量部分。
主要内容:
sem_init(&mutex, 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的设计一定存在一些问题。有没有人可以帮助指出并告诉我如何解决它?提前谢谢。