[issue10393] "with" statement isn't thread-safe
Abyx
report at bugs.python.org
Fri Nov 12 15:04:00 CET 2010
New submission from Abyx <fl.lllj at gmail.com>:
Code to reproduce the bug:
#include <python.h>
#include <windows.h>
DWORD WINAPI thread_fn(void* code)
{
PyGILState_STATE state = PyGILState_Ensure();
PyRun_SimpleString("with sync: print('.')\n");
PyGILState_Release(state);
return 0;
}
int main()
{
PyEval_InitThreads();
Py_Initialize();
PyRun_SimpleString("import _thread\n");
PyRun_SimpleString("sync = _thread.allocate_lock()\n");
PyThreadState* mainstate = PyEval_SaveThread();
HANDLE hThread1 = CreateThread(0, 0, thread_fn, 0, 0, 0);
HANDLE hThread2 = CreateThread(0, 0, thread_fn, 0, 0, 0);
WaitForSingleObject(hThread1, INFINITE);
WaitForSingleObject(hThread2, INFINITE);
PyEval_RestoreThread(mainstate);
Py_Finalize();
}
------------ Output ------
.
.
Traceback (most recent call last):
File "<string>", line 2, in <module>
NameError: name '_[1]' is not defined
----------- End of output -----
Probably both threads uses the same "_" global variable. First thread releases GIL in "print" function, then second thread overwrites "_", and then first thread raises the NameError accessing "_" later. Sometimes (not ever) the "sync" kept locked, and program deadlocks on next "sync.acquire()" call from another thread (if any).
----------
components: Interpreter Core
messages: 121035
nosy: Abyx
priority: normal
severity: normal
status: open
title: "with" statement isn't thread-safe
type: crash
versions: Python 3.1
_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue10393>
_______________________________________
More information about the Python-bugs-list
mailing list