summaryrefslogtreecommitdiffstats
path: root/Lib/test/test_free_threading/test_str.py
diff options
context:
space:
mode:
Diffstat (limited to 'Lib/test/test_free_threading/test_str.py')
-rw-r--r--Lib/test/test_free_threading/test_str.py75
1 files changed, 75 insertions, 0 deletions
diff --git a/Lib/test/test_free_threading/test_str.py b/Lib/test/test_free_threading/test_str.py
new file mode 100644
index 0000000..f5e93b7
--- /dev/null
+++ b/Lib/test/test_free_threading/test_str.py
@@ -0,0 +1,75 @@
+import sys
+import unittest
+
+from itertools import cycle
+from threading import Event, Thread
+from unittest import TestCase
+
+from test.support import threading_helper
+
+@threading_helper.requires_working_threading()
+class TestStr(TestCase):
+ def test_racing_join_extend(self):
+ '''Test joining a string being extended by another thread'''
+ l = []
+ ITERS = 100
+ READERS = 10
+ done_event = Event()
+ def writer_func():
+ for i in range(ITERS):
+ l.extend(map(str, range(i)))
+ l.clear()
+ done_event.set()
+ def reader_func():
+ while not done_event.is_set():
+ ''.join(l)
+ writer = Thread(target=writer_func)
+ readers = []
+ for x in range(READERS):
+ reader = Thread(target=reader_func)
+ readers.append(reader)
+ reader.start()
+
+ writer.start()
+ writer.join()
+ for reader in readers:
+ reader.join()
+
+ def test_racing_join_replace(self):
+ '''
+ Test joining a string of characters being replaced with ephemeral
+ strings by another thread.
+ '''
+ l = [*'abcdefg']
+ MAX_ORDINAL = 1_000
+ READERS = 10
+ done_event = Event()
+
+ def writer_func():
+ for i, c in zip(cycle(range(len(l))),
+ map(chr, range(128, MAX_ORDINAL))):
+ l[i] = c
+ done_event.set()
+
+ def reader_func():
+ while not done_event.is_set():
+ ''.join(l)
+ ''.join(l)
+ ''.join(l)
+ ''.join(l)
+
+ writer = Thread(target=writer_func)
+ readers = []
+ for x in range(READERS):
+ reader = Thread(target=reader_func)
+ readers.append(reader)
+ reader.start()
+
+ writer.start()
+ writer.join()
+ for reader in readers:
+ reader.join()
+
+
+if __name__ == "__main__":
+ unittest.main()