Professional Documents
Culture Documents
Raymonds' Tree Mutal Exclusion
Raymonds' Tree Mutal Exclusion
import time
import random
class Node:
def __init__(self, node_id):
self.node_id = node_id
self.parent = None
self.children = []
self.requesting_cs = False
self.token = False
self.cs_lock = threading.Lock()
def request_critical_section(self):
self.requesting_cs = True
if self.token:
self.enter_critical_section()
else:
self.send_request_to_parent()
def send_request_to_parent(self):
if self.parent is not None and not self.token:
self.parent.receive_request(self)
def receive_token(self):
self.token = True
if self.requesting_cs:
self.enter_critical_section()
else:
self.send_token_to_requesting_child()
def send_token_to_requesting_child(self):
for child in self.children:
if child.requesting_cs:
self.send_token_to_child(child)
break
def enter_critical_section(self):
self.cs_lock.acquire()
print(f"Node {self.node_id} entering critical section")
time.sleep(random.uniform(0.5, 1.5)) # Simulate critical section work
print(f"Node {self.node_id} exiting critical section")
self.cs_lock.release()
self.requesting_cs = False
self.send_token_to_requesting_child()
def node_thread(node):
while True:
time.sleep(random.uniform(1, 5)) # Simulate non-critical section work
node.request_critical_section()
# Example usage
num_nodes = 5
nodes = [Node(i) for i in range(num_nodes)]