写在前面
这次的实验:Linux下的多线程编程,我写了一天,调了一天。感觉本程序猿就是90%的时间用来写代码,90%里有60%用来调试和解决bug的。(捂脸状)
这里的调试技巧是我自己总结的一点东西,有什么问题还请指出~
实验环境
Centos 7.0, gcc 4.8.5
问题
写三个线程,线程1、2用来分别读取1.dat和2.dat中的数据再分别存进buffer1和buffer2,线程3读取两个buffer并对数据进行加和乘两种操作再输出
这个例子有三个线程,我的问题就是经常编译运行完以后不退出程序。调试后发现有一个以上的线程一直在等待资源,而释放资源的线程早就已经结束了 ; 又或者是线程三抢先了之类的(这个是我信号量忘记初始化导致的)。
干货
1.编译以后,比如 gcc -o test test.c -lpthread
, 进入gdb调试:gdb test
2.进来以后可以先在三个线程打上断点:b thread1
, b thread2
, b thread3
。(这里b就是break的简写,写break也可以)
3.接下来输入r
运行
4.然后可以输入 n
(单条语句执行,next命令简写),或是c
(继续运行程序,continue命令简写)
运行到这里会发现停下来了,但是没有正常的退出:
5.现在我们先用ctrl + c
,让它停一下。
然后,通过命令 info thread
查看还在运行的线程信息:
在这里,Id
是gdb给线程分配的id, 前面的*
表示当前的线程是Id
为1的那个
接下来通过命令 thread 4
, 我们可以切换到Id
为4的线程中,去查看它到底是谁;通过命令bt
(查看函数栈)查看该线程阻塞在哪儿了。
可以看到的是线程thread3()阻塞在了sem_wait()上。那么接下来我们就应该推一下是什么原因导致了它一直等待而且等不到信号量。
PS: 在bt
后,还可以通过 up
,down
来让函数栈往上或往下