LINUX下C开发所遇问题总结2--多线程问题

本人是一名新手,还是第一次接触到多线程编程的项目,现将项目中遇到的问题记录如下,以便日后自己查询,也希望给他人带来帮助,水平有限,有说的不对
的地方还请见谅并指正!


一个FASTCGI的开发项目,原本程序的架构如下:


1、一个主进程有多个FASTCGI(以下简称FCGI)线程和多个查询(SEARCH)线程;
2、FCGI线程,用于接受请求,每个CGI线程都有一个队列用于存储请求信息;
3、平时search线程处于阻塞状态,当有查询请求时,FCGI线程将查询信息放入队列中,并激活Search线程,进行查询,返回结果。


因为之前的程序对应每种查询都是独立的模块,全部是分开处理的,也就是说,之前每有一种新的查询需求,都要拷贝一份所有的文件,然后改写SEARCH文件,
这样的话每个分类的检索就要有相应的路径及进程于其相对应,在用户来看本来同样类型的搜索却跑到了不同的地址下,感觉不好,再有也浪费了很多的资源,
为一项服务开启了大量的进程。为了解决这个问题,现在需要将程序进行整合,同类的搜索写入同一个文件,这次遇到的问题也就由此出现了。


由于程序是用C++实现的,每种查询都对应着一个类文件,所以一开始我这样想,在主进程文件中(其实也就是一个类),之前是只有一个search对象,那么我
现在将所有的search对象全部加进来,然后,跟椐请求信息中的指定参数来调用不同的search线程,以达到目的,我想这应该也是大多数人想到的方法,但是当
我这样实现后问题就出现了,在测试时,发现当输入查询条件时,有时候反应很快,而且结果也顺利返回,但是更多的时候是反应很慢,而且返回的是空结果。


一开始真的是不知道问题出现在了哪里,从结果来看,很明显是请求超时导致的,但是,是什么问题导致的请求超时呢?而且程序既然没有出现404,那就是内部
超时,跟踪程序的运行时也发现,程序确实也运行到了相应的search对象当中,但是在此返回检索结果之前,就已经输出结果了(也就是空结果)!!!当时觉得
难道这是自然现象?本来就是这样的???但是拿分开的程序测试时,却从来没有出现过这种情况。于是很郁闷。。。


当时找不到问题所在,我就想是不是自己没把程序的流程没弄清楚,于是又看了几遍代码,最后注意到了锁的问题,我发现,所有的search线程都共用了相同的锁,
于是我就联想到,是不是由于所有的search线程都放在了相同的阻塞队列中,当有查询请求时,虽说激活了search线程,但是,所需要的线程却排的比较靠后,由此
造成了查询的超时,有了想法后就开始修改程序,对不同类型的search线程设置了不同的条件锁,发现修改后,问题解决了,呵呵!不容易啊,竟然让我蒙对了问题
所在!!!


通过这次问题使我对多线程的锁有了新的认识,我感觉,系统好像是根据条件锁来设置阻塞队列,不同的条件锁对应着不同的阻塞队列,以此来控制多个线程!不知
道这样理解对不对!!??
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值