gh-112535: Add test on _Py_ThreadId() (#112709) · python/cpython@c5fa8a5

GitHub

@@ -2854,5 +2854,60 @@ def testfunc(n, m):

28542854self.assertIn("_FOR_ITER_TIER_TWO", uops)

[email protected](support.Py_GIL_DISABLED, 'need Py_GIL_DISABLED')

2858+classTestPyThreadId(unittest.TestCase):

2859+deftest_py_thread_id(self):

2860+# gh-112535: Test _Py_ThreadId(): make sure that thread identifiers

2861+# in a few threads are unique

2862+py_thread_id=_testinternalcapi.py_thread_id

2863+short_sleep=0.010

2864+2865+classGetThreadId(threading.Thread):

2866+def__init__(self):

2867+super().__init__()

2868+self.get_lock=threading.Lock()

2869+self.get_lock.acquire()

2870+self.started_lock=threading.Event()

2871+self.py_tid=None

2872+2873+defrun(self):

2874+self.started_lock.set()

2875+self.get_lock.acquire()

2876+self.py_tid=py_thread_id()

2877+time.sleep(short_sleep)

2878+self.py_tid2=py_thread_id()

2879+2880+nthread=5

2881+threads= [GetThreadId() for_inrange(nthread)]

2882+2883+# first make run sure that all threads are running

2884+forthreadinthreads:

2885+thread.start()

2886+forthreadinthreads:

2887+thread.started_lock.wait()

2888+2889+# call _Py_ThreadId() in the main thread

2890+py_thread_ids= [py_thread_id()]

2891+2892+# now call _Py_ThreadId() in each thread

2893+forthreadinthreads:

2894+thread.get_lock.release()

2895+2896+# call _Py_ThreadId() in each thread and wait until threads complete

2897+forthreadinthreads:

2898+thread.join()

2899+py_thread_ids.append(thread.py_tid)

2900+# _PyThread_Id() should not change for a given thread.

2901+# For example, it should remain the same after a short sleep.

2902+self.assertEqual(thread.py_tid2, thread.py_tid)

2903+2904+# make sure that all _Py_ThreadId() are unique

2905+fortidinpy_thread_ids:

2906+self.assertIsInstance(tid, int)

2907+self.assertGreater(tid, 0)

2908+self.assertEqual(len(set(py_thread_ids)), len(py_thread_ids),

2909+py_thread_ids)

2910+2911+28572912if__name__=="__main__":

28582913unittest.main()