首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于多线程编程 glibc detected double free or corruption解决思路

2013-01-11 
关于多线程编程 glibc detected double free or corruption我写了个程序,里面用到openmp生成多线程, 我把

关于多线程编程 glibc detected double free or corruption
我写了个程序,里面用到openmp生成多线程, 我把多线程去掉,就不会报错, 一旦我把多线程加上去,它就会报如下错误

*** glibc detected *** ./MPOTU3: double free or corruption (top): 0xb5e004b8 ***
======= Backtrace: =========
/lib/libc.so.6[0x363595]
/lib/libc.so.6(cfree+0x59)[0x3639d9]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0x66e581]
/usr/lib/libstdc++.so.6(_ZNSs4_Rep10_M_destroyERKSaIcE+0x1d)[0x64b14d]
/usr/lib/libstdc++.so.6(_ZNSs9_M_mutateEjjj+0x1b5)[0x64cf75]
/usr/lib/libstdc++.so.6(_ZNSs12_M_leak_hardEv+0x61)[0x64d9a1]
/usr/lib/libstdc++.so.6(_ZNSsixEj+0x31)[0x64da71]
./MPOTU3[0x804db4a]
/usr/lib/libgomp.so.1[0x16f23c]
/lib/libpthread.so.0[0x2e85ab]
/lib/libc.so.6(clone+0x5e)[0x3cbcfe]
======= Memory map: ========
00149000-00163000 r-xp 00000000 08:01 168692103  /lib/ld-2.5.so
00163000-00164000 r--p 00019000 08:01 168692103  /lib/ld-2.5.so
00164000-00165000 rw-p 0001a000 08:01 168692103  /lib/ld-2.5.so
00167000-00174000 r-xp 00000000 08:01 125846106  /usr/lib/libgomp.so.1.0.0
00174000-00175000 rw-p 0000c000 08:01 125846106  /usr/lib/libgomp.so.1.0


基本定位后发现,应该是加了多线程后出错, 部分源码

[align=left]string sseq = getseq(*cu);
                        long vsize = tvector.size();
                        mis.resize(vsize);
                        #pragma omp parallel for num_threads(4)
                        for(long i=0; i < vsize; i++)
                        {
                                string qseq = tvector[i].first;
                                int Mismatch = 0;
                                int len = qseq.size() > sseq.size() ? qseq.size() : sseq.size();
                                for(int j = 0; j < len; j++)
                                {
                                        if(qseq[j] != sseq[j])
                                        {


                                                Mismatch++;
                                        }
                                        if(Mismatch > diffr)
                                        {
                                                Mismatch = qseq.size();
                                        }
                                }

                                mis[i] = Mismatch;

                        }[/align]
大虾多多帮忙, 谢谢
[解决办法]
vsize有多大?
可能是栈溢出,尝试增加栈或者设置openmp stack环境变量
[解决办法]
多线程有没有共享什么数据?
一个错误像是指针被多次free。可能你两个线程里都把指针free。
另一个Segmentation fault,也有可能是一个线程把资源释放了,另一个线程又去访问导致的

热点排行