信号量不互相等待
Semaphores not waiting on each other
我遇到的问题是,在代码部分运行之前,信号量没有相互等待。输出如下:
Customer 1 arriving at lane 1 at 0 sec
Customer 1 in now number 1 at lane 1
Checkout1 now serving customer 1 for 10 sec
Customer 2 arriving at lane 2 at 3
Customer 2 in now number 1 at lane 2
Checkout2 now serving customer 2 for 15sec
Customer 3 arriving at lane 1 at 7 sec
Customer 3 in now number 2 at lane 1
Checkout1 now serving customer 3 for 8 sec
Customer 4 arriving at lane 2 at 9
Customer 4 in now number 2 at lane 2
Checkout2 now serving customer 4 for 75sec
Cusomter 1 has left checkout1
Customer 5 arriving at lane 1 at 12 sec
Customer 5 in now number 2 at lane 1
Checkout1 now serving customer 5 for 20 sec
Cusomter 3 has left checkout1
Cusomter 2has left checkout2
Cusomter 5 has left checkout1
Cusomter 4has left checkout2
问题是,当checkout1处理customer1时,客户应该在处理另一个人之前离开,然而,checkout1然后服务另一个客户,即客户3。在节目快结束的时候,人们开始离开收银台。我很确定这是我的信号量的问题。
下面是我的代码的简化版本:
sem_t *mem_mutexCheckout1Count;
sem_t *mem_mutexCheckout2Count;
sem_t *mem_mutexCheckout1Line;
sem_t *mem_mutexCheckout2Line;
int *pmemCheckout1Line;
int *pmemCheckout2Line;
int main()
{
for(int i = 0; i < myCustomers.size(); i++)
{
totalArrivalTime += myCustomers[i].arrival;
if((pid = fork()) == 0)
{
InLine(myCustomers[i].serial, totalArrivalTime, myCustomers[i].processing);
_exit(0);
}
}
}
void InLine(int serial, int arrivalTime, int time_interval)
{
sleep(arrivalTime);
if(*pmemCheckout1Line <= *pmemCheckout2Line)
{
cout << "Customer " << serial << " arriving at lane 1 at " << arrivalTime << " sec" << endl;
sem_wait(mem_mutexCheckout1Line);
*pmemCheckout1Line += 1;
sem_post(mem_mutexCheckout1Line);
cout << "Customer " << serial << " in now number " << *pmemCheckout1Line << " at lane 1" << endl;
sem_wait(mem_mutexCheckout1Count);
cout << "Checkout1 now serving customer " << serial << " for " << time_interval << " sec" << endl;
sleep(time_interval);
*pmemCheckout1Line -= 1;
cout << "Cusomter " << serial << " has left checkout1" << endl;
sem_post(mem_mutexCheckout1Count);
}
else
{
cout << "Customer " << serial << " arriving at lane 2 at " << arrivalTime << endl;
sem_wait(mem_mutexCheckout2Line);
*pmemCheckout2Line += 1;
sem_post(mem_mutexCheckout2Line);
cout << "Customer " << serial << " in now number " << *pmemCheckout2Line << " at lane 2" << endl;
sem_wait(mem_mutexCheckout2Count);
cout << "Checkout2 now serving customer " << serial << " for " << time_interval << "sec" << endl;
sleep(time_interval);
*pmemCheckout2Line -= 1;
cout << "Cusomter " << serial << "has left checkout2" << endl;
sem_post(mem_mutexCheckout2Count);
}
}
我的myCustomers向量看起来像
Vectorindex-Customerserial-timeElapsedSincePrevCustomer-ProcessTime
-------------
[0] 1 0 10
[1] 2 3 15
[2] 3 4 8
[3] 4 2 75
[4] 5 3 20
如果您希望在正在处理的客户离开之前阻止任何其他客户被处理,则只使用一个信号量,当客户正在处理时该信号量被锁定,当客户离开时该信号量被解锁
if(*pmemCheckout1Line <= *pmemCheckout2Line)
{
cout << "Customer " << serial << " arriving at lane 1 at " << arrivalTime << " sec" << endl;
sem_wait(mem_mutexCheckout1Line);
*pmemCheckout1Line += 1;
cout << "Customer " << serial << " in now number " << *pmemCheckout1Line << " at lane 1" << endl;
cout << "Checkout1 now serving customer " << serial << " for " << time_interval << " sec" << endl;
sleep(time_interval);
*pmemCheckout1Line -= 1;
cout << "Cusomter " << serial << " has left checkout1" << endl;
sem_post(mem_mutexCheckout1Line);
}
我发现我的信号量不在共享内存中,因此信号量不能正常工作。我:
mem_mutexCheckout1Count = (sem_t*) mmap(NULL, sizeof(mem_mutexCheckout1Count), PROT_READ | PROT_WRITE, MAP_SHARED|MAP_ANONYMOUS, -1, 0);
相关文章:
- 删除旧的信号量系统V
- 父进程和子进程之间的 POSIX 信号量
- 访问共享内存而不使用易失性、std::atomic、信号量、互斥锁和自旋锁
- 多线程.如果我使用信号量,我可以在开始时创建很多线程还是应该只有几个线程?
- C/C++ - 用于按顺序打印数字的 sem_t 类型的单个信号量
- 如何在长时间运行的方法中等待信号?
- 如何避免等待信号已经发送的pthread_cond_t
- 单车道桥 使用信号量进行同步
- 用于 64 位/32 位 IPC 的 POSIX 信号量的替代方案?
- 这个餐饮哲学家问题(dpp)的解决方案是如何工作的?互斥体和信号量
- 如何让一个线程继续,而另一个线程正在等待C++中的信号量
- C++ 使用信号量而不是忙于等待
- Windows高速模式(C++):等待信号量(WaitForSingleObjectEx):失败,访问被拒绝[部分解决]
- 如果我们不等待就发出信号量会发生什么
- 信号量未能等待,原因"Resource temporarily unavailable"
- 等待多个信号量而不等待(C/ c++ Linux)
- 尝试等待信号量时出错
- 如何有效地等待一组信号量
- 信号量不互相等待
- 我可以在等待/信号量中切换测试和修改部分吗?