【发布时间】:2011-10-10 04:39:29
【问题描述】:
我正在编写一个使用多个线程来处理传入订单的股票市场系统。
项目进展顺利,直到我又添加了一个线程。当我启动上述线程时,我的程序段错误。段错误是在上述线程中由无效的内存读取产生的。
此段错误仅在程序使用优化 -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.c和limit.c中
编辑: Valgrind 指定无效读取发生在第 4 行。第 4 行是函数的“头”。我不知道编译器的内部结构,所以我天真的想法是这个论点是错误的。 BUT 在使用 gdb 时在 segfault 参数之后,因为程序已经优化,is optimized out 根据 gdb。所以我不认为那是罪魁祸首。
【问题讨论】:
标签: c gcc pthreads segmentation-fault