-
Notifications
You must be signed in to change notification settings - Fork 0
/
Bariera.py
67 lines (53 loc) · 1.59 KB
/
Bariera.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# -*- coding: utf-8 -*-
__author__ = 'Konrad'
import threading
import time
class myThread(threading.Thread):
threadCounter = 0
barrierCounter = 0
exitCounter = 0
lock = threading.Lock()
cv = threading.Condition(lock)
def __enter__(self):
return self
def __init__(self, threadID, name):
threading.Thread.__init__(self)
self.threadID = threadID
self.name = name
with myThread.lock:
myThread.threadCounter += 1
def run(self):
print(self.name + " is starting.")
time.sleep(self.threadID * 2)
print(self.name + " is ending.")
self.barrier()
print(self.name + " - ended")
@staticmethod
def barrier():
myThread.cv.acquire()
myThread.barrierCounter += 1
while myThread.barrierCounter < myThread.threadCounter:
myThread.cv.wait()
myThread.exitCounter += 1
if myThread.exitCounter >= myThread.threadCounter:
myThread.exitCounter = 0
myThread.barrierCounter = 0
myThread.cv.notify_all()
myThread.cv.release()
def __exit__(self, exc_type, exc_val, exc_tb):
with myThread.lock:
myThread.threadCounter -= 1
with myThread(1, "Thread 1") as t1, myThread(2, "Thread 2") as t2, myThread(3, "Thread 3") as t3:
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()
with myThread(1, "Thread 4") as t1, myThread(2, "Thread 5") as t2, myThread(3, "Thread 6") as t3:
t1.start()
t2.start()
t3.start()
t1.join()
t2.join()
t3.join()