如何防止TCriticalSection死锁?
我在多线程中主线程建立了TCriticalSection,然后传给多线程,并在多个地方使用了这个东西,却容易发生死锁,这个东西怎么使用啊?我是新手。
[解决办法]
记得加锁后要释放,一般容易突略的是发生异常忘记解锁了.
[解决办法]
在加锁的时候有一个非常重要的问题
就是A线程占用锁的时候 B已经得到数据,要使用锁
这个时候会造成程序忙等
容易down掉
我开发的时候就碰到这个问题
避免的方法是
写入锁尽量少做操作
直接丢掉一个vector或者list中
马上释放锁
而操作锁也不要做操作
只是将数据读取出来
马上释放锁
然后开始操作读取出来的数据
当然也可以参考holyfire的一篇关于并发控制的文章
http://www.libing.net.cn/read.php/1072.htm
[解决办法]
比如 我以我的程序架构为例:
MainThread使用TUDPServer等待数据到来
使用一个TCriticalSection *cs;
在OnUDPServerData的时候
cs-> Enter();
//PushData to list
cs-> Leave();
对于操作数据的地方:
cs-> Enter();
//Copy List Data to New List
cs-> Leave();
//Execute List Data
当然可能仅仅上面的操作都不足与能够帮你解决锁的问题
你需要在OnUDPServerData的时候 做一些初判断 丢弃一些数据