Closed
Description
Required prerequisites
- Make sure you've read the documentation. Your issue may be addressed there.
- Search the issue tracker and Discussions to verify that this hasn't already been reported. +1 or comment there if it has.
- Consider asking first in the Gitter chat room or in a Discussion.
What version (or hash if on master) of pybind11 are you using?
v2.13.6
Problem description
With free-threaded Python, I get data races when using static class variables defined like this:
#include <pybind11/pybind11.h>
namespace py = pybind11;
class Foo {
};
Foo Bar;
PYBIND11_MODULE(foo, m, py::mod_gil_not_used()) {
py::class_<Foo>(m, "Foo")
.def_readonly_static("Bar", &Bar);
}
I get multiple kinds of errors when accessing Foo.Bar
from multiple threads, from segmentation faults to "pybind11_object_dealloc(): Tried to deallocate unregistered instance!
" exceptions.
Further investigation suggested that it might come from Foo.Bar
being freed too many times. I'm unsure if it's a pybind11 or CPython issue so I'm posting it here.
Reproducible example code
import threading
from foo import Foo
def create_foo():
for _ in range(1000):
Foo.Bar
# keeping a reference to Foo.Bar prevents the issue from happening
# bar = Foo.Bar
nb_threads = 10
threads = [threading.Thread(target=create_foo) for _ in range(nb_threads)]
for thread in threads:
thread.start()
for thread in threads:
thread.join()
Is this a regression? Put the last known working version here if it is.
Not a regression
Metadata
Metadata
Assignees
Labels
No labels