`
yangyi
  • 浏览: 115295 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

多线程过桥的问题

阅读更多
题目:有一个南北向的桥,只能容纳一个人,现桥的两边分别有10人和12人,编制一个多线程序让这些人到达对岸,每个人用一个线程表示,桥为共享资源。在过桥的过程中显示谁在过桥及其走向。
import threading
import time
from collections import deque

class Person(threading.Thread):
    def __init__(self, id, msg):
        threading.Thread.__init__(self)
        self.id = id
        self.msg = msg
    def run(self):
        cross(self)
    def cross(self):
        print(str(self.id) + "\t" + self.msg)

class PersonPool(threading.Thread):
    canCross = threading.RLock()
    def __init__(self):
        threading.Thread.__init__(self)
        self.persons = deque([])
        self.shutdown = False
    def add(self, person):
        self.persons.append(person)
    def stop(self):
        self.shutdown = True
    def run(self):
        self.waitForPerson()
    def waitForPerson(self):
        while self.shutdown == False:
            PersonPool.canCross.acquire()
            while len(self.persons) != 0:
                person = self.persons.popleft()
                person.cross()
            time.sleep(1)
            PersonPool.canCross.release()

if __name__ == "__main__":
    nsPool = PersonPool()
    snPool = PersonPool()

    snPool.start()
    nsPool.start()

    for i in xrange(0, 10):
        snPool.add(Person(i, "From North To South"))
    for j in xrange(0, 12):
        snPool.add(Person(j, "From South To North"))
分享到:
评论

相关推荐

    生产者消费者问题和猴子过桥问题源代码

    生产者消费者问题是多线程编程中的经典问题,它模拟了两个不同角色——生产者和消费者在共享资源时的协作情况。在这个模型中,生产者负责创建数据,而消费者则负责消费这些数据。为了保证系统的稳定运行,需要防止...

    linux进程间通信实验,模拟车辆过桥

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间共享数据、交换信息的...同时,这也是一个很好的练习,能让你掌握多线程、同步与互斥等概念,以及如何在实践中避免常见的并发问题。

    作系统常见的进程或线程同步问题

    在多处理器或多线程环境中,同步机制变得尤为重要,因为资源(如内存、磁盘、网络等)往往是共享的,不当的同步会导致死锁、饥饿、竞态条件等问题。 ### 进程或线程同步基本原理 进程或线程同步的基本思想是控制...

    进程的同步与互斥习题(含部分题目的参考答案).doc

    本文将对进程的同步与互斥习题进行详细的解释和分析,涵盖了多种不同的场景和问题,包括进程的同步、互斥、信号量、缓冲区、生产者消费者问题、读者写者问题、司机与售票员问题、汽车过桥问题等。 一、进程的同步与...

    LEC11 并发程序设计(独木桥问题)1

    【并发程序设计】在计算机操作系统中,特别是在多进程或线程环境下,并发程序设计是确保系统资源有效管理和安全运行的...这种同步机制在操作系统和多线程编程中广泛应用,对于避免死锁和资源竞争等并发问题至关重要。

    nachos操作系统实验三

    桥和电梯是经典的并发问题示例,用于演示如何在多线程环境中解决同步和互斥问题。在桥的例子中,可能存在多个车辆或行人试图同时过桥,但桥梁的承重有限。电梯问题则关注如何有效地调度电梯服务多层楼的乘客。在...

    C语言实现pv操作演示程序

    5. **进程管理**:可能使用`fork()`或线程API(如`pthread_create()`)创建多个并发执行的实体,每个实体都有自己的临界区,并在进入和离开时调用P、V操作。 6. **示例应用**:如银行家算法、生产者消费者问题、哲学...

    Google的15道面试题与答案

    【知识点详解】 1. **递归问题解决**:在第一道面试题中,涉及的是一个...这些面试题覆盖了逻辑推理、概率统计、几何计算、算法设计等多个IT领域的知识点,反映了产品经理和软件工程师需要具备的基本技能和思维方式。

    操作系统信号量.docx

    操作系统信号量是操作系统中的一种机制,用于解决多进程或线程间的同步问题。信号量是一种特殊的变量,用于记录资源的可用数量。它可以被用来实现进程或线程之间的同步和互斥。 在操作系统中,信号量可以被用来解决...

    进程同步典型例题(操作系统).doc

    5. **读者写者问题**:这是一个经典的多线程同步问题。这里使用信号量实现第二类读者写者问题,确保多个读者可以同时读取数据,但写者和其他进程需要互斥访问。需要两个信号量,W表示写者访问,R表示当前阅读者数量...

    操作系统信号量1

    操作系统中的信号量是一种重要的同步机制,用于解决多进程或线程间的资源竞争问题。在给定的问题中,通过...在操作系统中,信号量是实现进程间通信和同步的重要工具,对于理解和设计多线程环境下的并发控制至关重要。

    计算机操作系统PV操作例题 .doc

    本文档提供了五个PV操作例题,涵盖了计算机操作系统中的多线程协调、同步和互斥问题。每个例题都提供了详细的PV操作解决方案,涵盖了PV操作的基本概念和应用。 问题 1:司机与售票员的协调 在这个例子中,司机和...

    京东商城的一套开发笔试题

    - **过桥问题**:需要根据成员的速度和手电筒的传递,优化组合以达到最少时间。 - **分盐问题**:利用天平称重,通过三次操作将140克盐分为50克、90克和0克(剩余的归为50克)。 5. **其他**: - **进程与线程**...

    2012uc实习生招聘笔试题(研发类)

    这是一道经典的过桥问题,旨在测试解决问题的能力及团队合作意识。解法如下: 1. **第一步**:a和b先过桥,耗时2分钟; 2. **第二步**:a返回,耗时1分钟; 3. **第三步**:c和d一起过桥,耗时10分钟; 4. **第四步...

    程序员面试攻略 part1(共2个)

    10.13 面试例题:与线程有关的程序设计问题174 10.14 面试例题:废弃内存的自动回收175 10.15 面试例题:32位操作系统177 10.16 面试例题:网络性能177 10.17 面试例题:高速磁盘缓存177 10.18 面试例题:...

    程序员面试攻略part 2(共2个)

    10.13 面试例题:与线程有关的程序设计问题174 10.14 面试例题:废弃内存的自动回收175 10.15 面试例题:32位操作系统177 10.16 面试例题:网络性能177 10.17 面试例题:高速磁盘缓存177 10.18 面试例题:...

    工学操作系统期末复习.pptx

    操作系统是计算机系统中的核心软件,它管理着计算机的硬件资源,同时也为用户提供了与硬件交互的接口。在工学操作系统课程中,期末复习通常会覆盖...对于公路桥的问题,可以利用资源信号量来限制同时过桥的车辆数量。

    操作系统整理操作系统整理操作系统整理操作系统整理操作系统整理操作系统整理

    例如,在独木桥问题中,可以使用信号量来实现一次仅允许一人过桥。类似地,对于十字路口的安全行驶管理,也可以借助信号量来控制车辆的通行,确保每次只有一个方向的车辆可以通过,从而避免碰撞。 总的来说,操作...

    Java实验的答案源程序

    令行输入,要求用多线程自动播放。1)设有一个由10个英文单词构成的字符串数组,要求: (1)统计以字母w开头的单词数; (2)统计单词中含“or”字符串的单词数; (3)统计长度为3的单词数。 创建一个程序,输出...

Global site tag (gtag.js) - Google Analytics