-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathconditionVariableWaitCondition.py
More file actions
96 lines (73 loc) · 2.5 KB
/
conditionVariableWaitCondition.py
File metadata and controls
96 lines (73 loc) · 2.5 KB
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
"""
Copyright 2025 Huawei Technologies Co., Ltd.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""
import taskr
def conditionVariableWaitCondition(runtime):
# Contention value
value = 0
# Mutex for the condition variable
mutex = taskr.Mutex()
# Task-aware conditional variable
cv = taskr.ConditionVariable()
def fc(task):
nonlocal value
# Using lock to update the value
print("Thread 1: I go first and set value to 1")
mutex.lock(task)
value += 1
mutex.unlock(task)
# Notifiying the other thread
print("Thread 1: Now I notify anybody waiting")
while value != 1:
cv.notifyOne(task)
task.suspend()
# Waiting for the other thread's update now
print("Thread 1: I wait for the value to turn 2")
mutex.lock(task)
cv.wait(task, mutex, lambda: value == 2)
mutex.unlock(task)
print("Thread 1: The condition (value == 2) is satisfied now")
# Creating task functions
thread1Fc = taskr.Function(fc)
def fc(task):
nonlocal value
# Waiting for the other thread to set the first value
print("Thread 2: First, I'll wait for the value to become 1")
mutex.lock(task)
cv.wait(task, mutex, lambda: value == 1)
mutex.unlock(task)
print("Thread 2: The condition (value == 1) is satisfied now")
# Now updating the value ourselves
print("Thread 2: Now I update the value to 2")
mutex.lock(task)
value += 1
mutex.unlock(task)
# Notifying the other thread
print("Thread 2: Notifying anybody interested")
cv.notifyOne(task)
thread2Fc = taskr.Function(fc)
task1 = taskr.Task(0, thread1Fc)
task2 = taskr.Task(1, thread2Fc)
runtime.addTask(task1)
runtime.addTask(task2)
# Initializing taskr
runtime.initialize()
# Running taskr
runtime.run()
# Waiting for task to finish
runtime.await_()
# Finalizing taskr
runtime.finalize()
# Value should be equal to concurrent task count
expectedValue = 2
print(f"Value {value} / Expected {expectedValue}")
assert value == expectedValue