Я пытаюсь понять приведенный ниже сбой и не могу понять, почему/если thread_local имеет к этому какое-то отношение.
Вот как происходит сбой, как я его исправил, и мое неполное понимание того, как я не ждите первоначального сбоя (с объектом стека proton::container)
Я запускаю поток (назовем его ProtonThread, наследуя от потока и proton::messaging_handler) и в этом основном методе потока я выполняю proton::container::run(*this); в области видимости.
Это вызовет https://github.com/apache/qpid-proton/b ... id.cpp#L47 для генерации идентификатора, что означает, что thread_local создано в этой теме.
Как только proton::container::run() завершится, область действия завершится, и объект стека будет уничтожен (в ; но я также пробовал с переменной).
Это не должно повлиять на «движок» и он будет уничтожен при выходе потока. Я присоединяюсь к теме, вижу, что делаю чистый выход, чтобы все выглядело нормально.
Затем я снова запускаю тему. Теперь у меня происходит сбой при попытке запустить контейнер.
Одно из решений, которое я нашел, — не использовать объект стека в основной функции потока, а использовать член этого класса (ProtonThread). Таким образом, элемент proton::container будет создан из потока, создающего ProtonThread, что делает «движок» thread_local в этом потоке.
Это гарантирует, что «движок» жив, поскольку он является thread_local для другого потока, а не ProtonThread.< /p>
Я ожидал, что даже с ProtonThread движок thread_local должен работать нормально.
Я был бы признателен за любой намек на то, почему это может быть не так. дело
Program terminated with signal SIGABRT, Aborted.
#0 0x00007f13ede8b94c in __pthread_kill_implementation () from /lib64/libc.so.6
[Current thread is 1 (Thread 0x7f13e6ffb640 (LWP 792836))]
Missing separate debuginfos, use: dnf debuginfo-install cyrus-sasl-gssapi-2.1.27-21.el9.x86_64 cyrus-sasl-lib-2.1.27-21.el9.x86_64 cyrus-sasl-plain-2.1.27-21.el9.x86_64 gdbm-libs-1.19-4.el9.x86_64 glibc-2.34-100.el9_4.4.x86_64 jsoncpp-1.9.5-1.el9.x86_64 keyutils-libs-1.6.3-1.el9.x86_64 krb5-libs-1.21.1-2.el9_4.x86_64 libcom_err-1.46.5-5.el9.x86_64 libgcc-11.4.1-3.el9.x86_64 libnsl2-2.0.0-1.el9.x86_64 libselinux-3.6-1.el9.x86_64 libstdc++-11.4.1-3.el9.x86_64 libtirpc-1.3.3-8.el9_4.x86_64 libxcrypt-4.4.18-3.el9.x86_64 pcre2-10.40-5.el9.x86_64 qpid-proton-c-0.37.0-2.el9.x86_64 qpid-proton-cpp-0.37.0-2.el9.x86_64 zlib-1.2.11-40.el9.x86_64
(gdb) where
#0 0x00007f13ede8b94c in __pthread_kill_implementation () from /lib64/libc.so.6
#1 0x00007f13ede3e646 in raise () from /lib64/libc.so.6
#2 0x00007f13ede287f3 in abort () from /lib64/libc.so.6
#3 0x00007f13ede29130 in __libc_message.cold () from /lib64/libc.so.6
#4 0x00007f13ede959f7 in malloc_printerr () from /lib64/libc.so.6
#5 0x00007f13ede9671c in malloc_consolidate () from /lib64/libc.so.6
#6 0x00007f13ede982f8 in _int_malloc () from /lib64/libc.so.6
#7 0x00007f13ede99809 in malloc () from /lib64/libc.so.6
#8 0x00007f13ee73a75e in malloc (size=) at ../include/rtld-malloc.h:56
#9 allocate_dtv_entry (size=, alignment=8) at ../elf/dl-tls.c:730
#10 allocate_and_init (map=0x1f575e0) at ../elf/dl-tls.c:759
#11 tls_get_addr_tail (ti=0x7f13ed3fde58, dtv=0x7f13e00018f0, the_map=0x1f575e0) at ../elf/dl-tls.c:970
#12 0x00007f13ee73e76c in __tls_get_addr () at ../sysdeps/x86_64/tls_get_addr.S:55
#13 0x00007f13ed3dd187 in proton::uuid::random() () from /lib64/libqpid-proton-cpp.so.12
#14 0x00007f13ed3c6bfe in proton::container::container(proton::messaging_handler&) () from /lib64/libqpid-proton-cpp.so.12
Подробнее здесь: https://stackoverflow.com/questions/792 ... a-stack-ob
При использовании amqp qpid proton инициализация thread_local при создании объекта стека приводит к сбою моего потока, к ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение