gpt4 book ai didi

c++ - std::thread 使用 gcc-linaro-4.9.4 在 Raspbian 中导致段错误

转载 作者:可可西里 更新时间:2023-11-01 16:48:25 25 4
gpt4 key购买 nike

在我看来完全有效的代码中出现了段错误。

这是一个最小的重新创建示例:

#include <iostream>
#include <thread>

void func()
{
/* do nothing; thread contents are irrelevant */
}

int main()
{
for (unsigned idx = 0; idx < 1000; idx++)
{
std::thread t(func);
void* buffer = malloc(1000);
free(buffer);
t.join();
}
return 0;
}

我运行了打印,以检查哪个迭代失败;我在迭代 #292 时遇到段错误。

我使用了 gcc-linaro-4.9.4(取自此处:https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/)。

我是这样编译程序的:

arm-linux-gnueabihf-g++ -std=c++11 -std=gnu++11 -lpthread -pthread main.cpp -o main.out

我尝试在 gcc-linaro-6.5 中重新创建它,但没有遇到问题。

知道为什么会这样吗?

编辑1

编译这段代码时没有警告/错误。

在 strace 下运行它没有发现任何特别之处。

在 GDB 下运行它显示段错误发生在 free 函数中:

Thread 1 "main.out" received signal SIGSEGV, Segmentation fault.
_int_free (av=0x76d84794 <main_arena>, p=0x1e8bf, have_lock=0) at malloc.c:4043
4043 malloc.c: No such file or directory.
(gdb) bt
#0 _int_free (av=0x76d84794 <main_arena>, p=0x1e8bf, have_lock=0) at malloc.c:4043
#1 0x00010bfa in main ()

在 valgrind 下运行它会显示以下内容:

==361== Thread 2:
==361== Invalid read of size 4
==361== at 0x4951D64: ??? (in /usr/lib/arm-linux-gnueabihf/libstdc++.so.6.0.22)
==361== Address 0x4becf74 is 0 bytes after a block of size 28 alloc'd
==361== at 0x4847D4C: operator new(unsigned int) (vg_replace_malloc.c:328)
==361== by 0x11629: __gnu_cxx::new_allocator<std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::_Bind_simple<void (*())()> >, std::allocator<std::thread::_Impl<std::_Bind_simple<void (*())()> > >, (__gnu_cxx::_Lock_policy)2> >::allocate(unsigned int, void const*) (in /home/pi/main.out)
==361==
==361== Invalid write of size 4
==361== at 0x4951D6C: ??? (in /usr/lib/arm-linux-gnueabihf/libstdc++.so.6.0.22)
==361== Address 0x4becf74 is 0 bytes after a block of size 28 alloc'd
==361== at 0x4847D4C: operator new(unsigned int) (vg_replace_malloc.c:328)
==361== by 0x11629: __gnu_cxx::new_allocator<std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::_Bind_simple<void (*())()> >, std::allocator<std::thread::_Impl<std::_Bind_simple<void (*())()> > >, (__gnu_cxx::_Lock_policy)2> >::allocate(unsigned int, void const*) (in /home/pi/main.out)
==361==
==361==
==361== HEAP SUMMARY:
==361== in use at exit: 28,000 bytes in 1,000 blocks
==361== total heap usage: 2,002 allocs, 1,002 frees, 1,048,368 bytes allocated
==361==
==361== Thread 1:
==361== 28,000 bytes in 1,000 blocks are definitely lost in loss record 1 of 1
==361== at 0x4847D4C: operator new(unsigned int) (vg_replace_malloc.c:328)
==361== by 0x11629: __gnu_cxx::new_allocator<std::_Sp_counted_ptr_inplace<std::thread::_Impl<std::_Bind_simple<void (*())()> >, std::allocator<std::thread::_Impl<std::_Bind_simple<void (*())()> > >, (__gnu_cxx::_Lock_policy)2> >::allocate(unsigned int, void const*) (in /home/pi/main.out)
==361==
==361== LEAK SUMMARY:
==361== definitely lost: 28,000 bytes in 1,000 blocks
==361== indirectly lost: 0 bytes in 0 blocks
==361== possibly lost: 0 bytes in 0 blocks
==361== still reachable: 0 bytes in 0 blocks
==361== suppressed: 0 bytes in 0 blocks
==361==
==361== For counts of detected and suppressed errors, rerun with: -v
==361== ERROR SUMMARY: 2017 errors from 3 contexts (suppressed: 6 from 3)

编辑2

在删除 -lpthread-std=c++11 编译标志后,我仍然遇到段错误。我这次是这样编译的:

arm-linux-gnueabihf-g++ -std=gnu++11 -pthread main.cpp -o main.out

最佳答案

我认为问题是您的代码与您链接到的 libstdc++.so 库不匹配。

一种可能是在运行时使用了错误的 libstdc++.so,您可以使用 ldd 实用程序进行检查。 GCC 4.9.4 的正确版本是 libstdc++.so.6.0.20,所以如果您看到它链接到不同的版本,那就是问题了。

第二种可能性是它是正确的 libstdc++.so 但它是使用与您的代码不同的设置编译的,因此您代码中的 std::thread 使用shared_ptr 引用计数的原子操作,但库中的 std::thread 使用互斥锁(这与 GCC Bug 42734 中描述的问题相同)。如果使用 -march=armv5t 编译程序时崩溃和 valgrind 错误消失,那么它会确认这是问题所在。

关于c++ - std::thread 使用 gcc-linaro-4.9.4 在 Raspbian 中导致段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55157278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com