3个线程,一个线程遍历LIST读,一个线程LIST写,一个线程对LIST节点删除。由于第一个读的线程需要很高的实时性,所以设置的为3毫秒执行一次。问题就在这里了,在遍历前我LOCK了LIST,而读线程的执行频率很高,这样就导致,CPU在大多数的时间都是被读线程占用的了,导致对LIST写的线程半天都写不进去数据。(写线程的操作也很频繁)大家看看有什么好的处理方式没有,因为还有个线程是对节点进行删除的,如果读线程不LOCK的话,可能会导致数据问题。请不要简单的 lock 这个词就回答了哈。3Q。
调试欢乐多
不知道lz读和写的具体情况,所以很难说能不能写成lock-free的
读在一块如果以读为主的话 需要建立两个变量 记录读线程的操作位置和工作顺序
写删线程只允许对该操作位置以后(前)的数据进行操作(取决于工作顺序)读的时候不能 foreach 要用while() 因为写删操作会影响队列长度
并且为了提高效率 读线程一定要轮流使用正序和反序两种循环交替工作的方式,以给写删线程操作的机会 我想这样应该能到达lz的要求吧
读线程
list<T> TempList;
try
{
System.Threading.Monitor.Enter(Lockobj);TempList=new List<T>(WorkList);
}finally
{
System.Threading.Monitor.Exit(Lockobj);
}
后面操作TempList增加线程try
{
System.Threading.Monitor.Enter(Lockobj);你的增加处理
}finally
{
System.Threading.Monitor.Exit(Lockobj);
}删除线程try
{
System.Threading.Monitor.Enter(Lockobj);你的删除处理
}finally
{
System.Threading.Monitor.Exit(Lockobj);
}
从根本来说优化遍历或者说改变实现方式才是最好的解决方式。
表在写和删除操作时产生一个更新Event
在Event处理函数中进行读操作