| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | import unittest | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-06 15:59:48 -05:00
										 |  |  | from threading import Thread, Barrier | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | from unittest import TestCase | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 16:45:04 -07:00
										 |  |  | from test.support import threading_helper | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  | NTHREAD = 10 | 
					
						
							|  |  |  | OBJECT_COUNT = 5_000 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | class C: | 
					
						
							|  |  |  |     def __init__(self, v): | 
					
						
							|  |  |  |         self.v = v | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-06 16:45:04 -07:00
										 |  |  | @threading_helper.requires_working_threading() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | class TestList(TestCase): | 
					
						
							|  |  |  |     def test_racing_iter_append(self): | 
					
						
							|  |  |  |         l = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |         barrier = Barrier(NTHREAD + 1) | 
					
						
							|  |  |  |         def writer_func(l): | 
					
						
							|  |  |  |             barrier.wait() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  |             for i in range(OBJECT_COUNT): | 
					
						
							|  |  |  |                 l.append(C(i + OBJECT_COUNT)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |         def reader_func(l): | 
					
						
							|  |  |  |             barrier.wait() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  |             while True: | 
					
						
							|  |  |  |                 count = len(l) | 
					
						
							|  |  |  |                 for i, x in enumerate(l): | 
					
						
							|  |  |  |                     self.assertEqual(x.v, i + OBJECT_COUNT) | 
					
						
							|  |  |  |                 if count == OBJECT_COUNT: | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |         writer = Thread(target=writer_func, args=(l,)) | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  |         readers = [] | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |         for x in range(NTHREAD): | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |             reader = Thread(target=reader_func, args=(l,)) | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  |             readers.append(reader) | 
					
						
							|  |  |  |             reader.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         writer.start() | 
					
						
							|  |  |  |         writer.join() | 
					
						
							|  |  |  |         for reader in readers: | 
					
						
							|  |  |  |             reader.join() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def test_racing_iter_extend(self): | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |         l = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |         barrier = Barrier(NTHREAD + 1) | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |         def writer_func(): | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |             barrier.wait() | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |             for i in range(OBJECT_COUNT): | 
					
						
							|  |  |  |                 l.extend([C(i + OBJECT_COUNT)]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         def reader_func(): | 
					
						
							| 
									
										
										
										
											2025-03-26 12:08:20 -04:00
										 |  |  |             barrier.wait() | 
					
						
							| 
									
										
										
										
											2024-09-26 10:53:17 +02:00
										 |  |  |             while True: | 
					
						
							|  |  |  |                 count = len(l) | 
					
						
							|  |  |  |                 for i, x in enumerate(l): | 
					
						
							|  |  |  |                     self.assertEqual(x.v, i + OBJECT_COUNT) | 
					
						
							|  |  |  |                 if count == OBJECT_COUNT: | 
					
						
							|  |  |  |                     break | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         writer = Thread(target=writer_func) | 
					
						
							|  |  |  |         readers = [] | 
					
						
							|  |  |  |         for x in range(NTHREAD): | 
					
						
							|  |  |  |             reader = Thread(target=reader_func) | 
					
						
							|  |  |  |             readers.append(reader) | 
					
						
							|  |  |  |             reader.start() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         writer.start() | 
					
						
							|  |  |  |         writer.join() | 
					
						
							|  |  |  |         for reader in readers: | 
					
						
							|  |  |  |             reader.join() | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-06 15:59:48 -05:00
										 |  |  |     def test_store_list_int(self): | 
					
						
							|  |  |  |         def copy_back_and_forth(b, l): | 
					
						
							|  |  |  |             b.wait() | 
					
						
							|  |  |  |             for _ in range(100): | 
					
						
							|  |  |  |                 l[0] = l[1] | 
					
						
							|  |  |  |                 l[1] = l[0] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         l = [0, 1] | 
					
						
							|  |  |  |         barrier = Barrier(NTHREAD) | 
					
						
							|  |  |  |         threads = [Thread(target=copy_back_and_forth, args=(barrier, l)) | 
					
						
							|  |  |  |                    for _ in range(NTHREAD)] | 
					
						
							|  |  |  |         with threading_helper.start_threads(threads): | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-02 13:03:05 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | if __name__ == "__main__": | 
					
						
							|  |  |  |     unittest.main() |