Hi all, I've been working on embedding Python and have an interesting case around locking with PyEval_RestoreThread which wasn't quite doing what I expect, hoping someone can explain what I should expect here.
I have a little example (I'm running this in parallel from two different threads; I have some more C code for that but I don't think it's super interesting): void run_python(PyThreadState* thread) { LOG("Restoring thread %p...", thread); PyEval_RestoreThread(thread); LOG("Restored thread %p", thread); PyRun_SimpleString("import time; print('sleeping'); time.sleep(3.0)"); LOG("Saving thread..."); PyThreadState* saved_thread = PyEval_SaveThread(); LOG("Saved thread %p", saved_thread); } This produces output like 11:46:48.110058893: Restoring thread 0xabc480... 11:46:48.110121656: Restored thread 0xabc480 11:46:48.110166060: Restoring thread 0xabc480... sleeping 11:46:48.110464194: Restored thread 0xabc480 sleeping 11:46:51.111307541: Saving thread... 11:46:51.111361075: Saved thread 0xabc480 11:46:51.113116633: Saving thread... 11:46:51.113177605: Saved thread 0xabc480 The thing that surprises me is that both threads seem to be able to pass PyEval_RestoreThread before either reaches the corresponding PyEval_SaveThread call, which I wasn't expecting to happen; I assumed that since RestoreThread acquires the GIL, that thread state would remain locked until it's released. I understand that the system occasionally switches threads, which I guess might well happen with that time.sleep() call, but I wasn't expecting the same thread to become usable somewhere else. Maybe I am just confusing things by approaching the same Python thread from multiple OS threads concurrently and should be managing my own locking around that? Thanks in advance, Peter -- Thought Machine Group Limited, a company registered in England & Wales. Registered number: 11114277. Registered Office: 5 New Street Square, London EC4A 3TW <https://maps.google.com/?q=5+New+Street+Square,+London+EC4A+3TW&entry=gmail&source=g>. The content of this email is confidential and intended for the recipient specified in message only. It is strictly forbidden to share any part of this message with any third party, without a written consent of the sender. If you received this message by mistake, please reply to this message and follow with its deletion, so that we can ensure such a mistake does not occur in the future. -- https://mail.python.org/mailman/listinfo/python-list