【问题标题】:Using mutexes to solve a tunnel task使用互斥锁解决隧道任务
【发布时间】:2017-12-11 00:35:15
【问题描述】:

大家下午好。我已经开始学习 C 编程,并发现了一项有趣的任务来测试我的技能。老实说,这让我发疯,我不知道该怎么做。而不是使用信号量,我想使用互斥锁。我创建了一个自动调用 enter_tunnel 的程序,以便汽车进入。可能有两个方向 - 向北行驶( dir == NORTH )和向南行驶( dir == SOUTH ),但如果有汽车向您驶来,我不知道如何阻止汽车进入隧道。我试图找到更多关于如何使其工作的信息,但我不确定如何在这种情况下正确使用 pthread_mutex_lock、pthread_mutex_unlock、pthread_mutex_signal。

static int n_in_tunnel[2];
static unsigned long n_total[2];
static pthread_mutex_t tunnel_flow;

void enter_tunnel(direction_t dir) {
    int mutex = pthread_mutex_init(&tunnel_flow, NULL);
    assert(mutex == 0);

    n_in_tunnel[dir] += 1;
   // assert(n_in_tunnel[opposite(dir)] == 0);
}

void exit_tunnel(direction_t dir) {
    n_in_tunnel[dir] -= 1;
    n_total[dir] += 1;
}

【问题讨论】:

  • 你没有解释你的应用程序的设计,所以不可能推荐任何东西。每辆车都由自己的线程管理吗?
  • “隧道”是否只有一条车道,所以只有在所有车辆都朝同一方向行驶时才能允许车辆通行?如果是这样,那么需要计算当前在隧道中的车辆数量以及它们都在哪个目录。如果一辆新车朝同一方向行驶,请增加计数并让汽车进入。否则,代码如何跟踪试图以相反方向进入隧道的汽车数量。 IE。应用程序需要更多分析,保存的数据需要代表当前情况。

标签: c mutex


【解决方案1】:

有大量关于解决问题的文献,例如: https://docs.oracle.com/cd/E19683-01/806-6867/sync-12/index.html 此外,在堆栈溢出中,已经存在一个问题:Mutex example / tutorial? 最后,您的问题完全解决了:https://www.linkedin.com/pulse/semaphore-pthread-programming-linux-purvi-pathak?articleId=7625519368425966741 我可以在这里复制代码,但我不想抢夺作者成就的解决方案。

【讨论】:

    猜你喜欢
    • 2018-05-23
    • 1970-01-01
    • 2022-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-26
    • 2010-11-22
    相关资源
    最近更新 更多