gpt4 book ai didi

c - 启动新线程后出现段错误

转载 作者:太空狗 更新时间:2023-10-29 16:03:51 24 4
gpt4 key购买 nike

我正在编写一个股票市场系统,它使用多个线程来处理传入的订单。

项目进行得很顺利,直到我又添加了一个线程。当我启动上述线程时,我的程序出现段错误。段错误是由无效内存读取在上述线程中生成的。

此段错误在使用优化-O2 及更高版本编译程序时生成。

在使用 -g3 编译带有调试信息的程序并使用

运行 valgrind 之后
valgrind ./marketSim

并获得以下关于段错误的输出

==2524== Thread 5:
==2524== Invalid read of size 4
==2524== at 0x402914: limitWorker (limit.c:4)
==2524== by 0x4E33D5F: start_thread (in /lib/libpthread-2.14.so)
==2524== Address 0x1c is not stack'd, malloc'd or (recently) free'd
==2524==
==2524==
==2524== Process terminating with default action of signal 11 (SIGSEGV)
==2524== Access not within mapped region at address 0x1C
==2524== at 0x402914: limitWorker (limit.c:4)
==2524== by 0x4E33D5F: start_thread (in /lib/libpthread-2.14.so)

线程是这样发起的

pthread_t limit_thread;
pthread_create(&limit_thread, NULL, limitWorker, q);

q 是变量,它也传递给我初始化的其他线程

limitWorker代码如下

void *limitWorker(void *arg){
while(1){
if ((!lsl->empty) && (!lbl->empty)) {
if ((currentPriceX10 > lGetHead(lsl)->price1) && (currentPriceX10 < lGetHead(lbl)->price1)) {
llPairDelete(lsl,lbl);
}
}
}
return NULL;
}

第 4 行:根据 valgrind 产生段错误的行是 void *limitWorker(void *arg){

还有一些信息,这是使用 gcc 4.6.1 编译的,当使用 gcc 4.1.2 时,程序不会出现段错误,即使它经过优化,尽管它的性能要差得多。

当使用 clang 编译程序时,它在优化时也不会出现段错误。

问题

我是不是搞错了??这是一个gcc错误吗?我应该采取什么行动??

如果您想查看代码,github 页面是 https://github.com/spapageo/Stock-Market-Real-Time-System/

有问题的代码在文件 marketSim.climit.c

编辑: Valgrind 指定无效读取发生在第 4 行。第 4 行是函数的“头部”。我不知道编译器内部原理,所以我天真的想法是这个论点是错误的。 但是在段错误参数之后使用gdb时,因为程序被优化了,被优化掉根据gdb。所以我不认为那是罪魁祸首。

最佳答案

如果您正在为 64 位系统编译,则 0x1corder 结构中 price1 字段的偏移量。这意味着当故障发生时,lsl->HEADlbl->HEAD 中的任何一个(或两者)都是 NULL 指针。

请注意,因为您的 limitWorker() 函数不包括 llPairDelete() 函数之外的线程同步,所以它是不正确的,编译器可能不会在循环的每次执行。您应该使用互斥锁来保护链接列表即使在只读路径中也是如此

此外,您的 lsllbl 变量是多重定义的。您应该在 limit.h 中将它们声明为 extern,并在 limit.c 中定义它们而不使用 extern

关于c - 启动新线程后出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6775914/

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