谋求多线程不阻塞操作的解决方案

寻求多线程不阻塞操作的解决方案
环境如下,在一台双核cpu的机器上,开启了2个线程,一个接收udp消息并缓存,另一个线程读取缓冲并提交到数据库。
接收的消息量达到每秒钟十万条,数据库是本地的数据库,sqlite的。
之前缓存和提交在一个线程中执行,在提交的时候会导致阻塞,套接字接收不到数据。所以专门开启了一个线程专门执行提交操作。得到了很大改善。
但是还是不能完全解决问题,还是会阻塞。只是阻塞时间变短了。

问题出在哪里了?
io阻塞了?cpu阻塞了?我觉得多线程可以解决这2个问题啊,但是并没有如我所愿。

谁有好的解决方案推荐,不胜感激。

------解决方案--------------------
http://blog.csdn.net/sparkliang/article/category/660506

可以看看这个先
------解决方案--------------------
不懂数据库, 下面只是想法。

感觉如果提交没有收数据快的话, 是会存在堵塞的情况的。
即使是开比较大的Buff缓存多条数据, 也会出现类似的情况。

如果一次可以提交多条数据的话, 可以试下把数据缓存在较大的Buff里,一次提交多条数据。
------解决方案--------------------
是不是由于对缓冲区加锁导致??
------解决方案--------------------
引用:
现在我不明白的问题是:
既然开启了多线程,为什么提交的操作还会影响到另一个线程的写缓存操作?
缓存足够大,而且每10000条才提交一次。缓存分配在全局变量区。


这当然会啊,我不知道你在缓冲区里用了什么锁,通常是条件变量加读写锁,当写的速度比读的快,以致缓冲区满的时候写线程就会被条件变量阻塞了。
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

现在我不明白的问题是:
既然开启了多线程,为什么提交的操作还会影响到另一个线程的写缓存操作?
缓存足够大,而且每10000条才提交一次。缓存分配在全局变量区。


这当然会啊,我不知道你在缓冲区里用了什么锁,通常是条件变量加读写锁,当写的速度比读的快,以致缓冲区满的时候写线程就会被条件变量阻塞了。

我的锁是单向的,写线程不加锁,只有写够10000条才释放一个一个信号量。
提交线程获取到信号量才提交。
假设提交速度慢,要提交的数据可能被写缓存的线程修改。这种顶多是提交错误的数据。但是不应该是收不到包。

用读写锁试试
------解决方案--------------------
建议两个线程设立两个缓冲区,
缓冲线程:接收数据---->拿锁---->提交数据到缓冲队列1---->解锁;
数据库线程:拿锁---->把缓冲队列1的数据复制到缓冲队列2,然后清空---->解锁---->把缓冲队列2插入关系库,然后清空;
这样两个线程交互的耗时应该主要在内存复制上面,不知道能不能达到你要求?



------解决方案--------------------
udp协议不能进行流量控制,若接受套接字的缓存满,而接收进程不及时读取,数据就被丢弃了,你将接收缓存设置大一些,不要让接收线程被锁定很长时间。
------解决方案--------------------
换固态硬盘试试。