多线程问题请教 运行OK就没问题,运行不OK就肯定有问题,代码又不是看出结果的,实践出真知 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 加了Lock,其它线程是访问不到的。创建它的线程可以访问。 访问到的,Lock 只是锁对象,不会锁方法的调用啊。 主要是看要不要枷锁啊,逻辑OK运行就OK。 4个DoCheck都没有参数?所以4个DoCheck其实是一模一样的在跑同一个过程?这样设计有什么意义么... 有一个主线程负责向队列里压数据,4个线程负责跑这个队列。只为提供执行效率。问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.而且此处IO操作必须是对不同的资源进行操作.否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行. Lock 是针对于多个线程访问操作同一对象时才Lock···加锁···注意是 多个同时操作同一个对象 有一个主线程负责向队列里压数据,4个线程负责跑这个队列。只为提供执行效率。问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.而且此处IO操作必须是对不同的资源进行操作.否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行.声明的队列是一个全局变量,所以压入和弹出都要加锁的。数据压入的速度远大于数据弹出的速度。数据读出来后是要做复杂的操作的,程序中的瓶颈不是主线程压入队列的效率低,是对队列中的数据做操作的效率低。会进行复杂的IO操作。 GetDequeue没有问题,但把 if (!Interlocked.Equals(isStop, 0))换成比如VolatileRead:if (Thread.VolatileRead(ref isStop) != 0)如果坚持用Interlocked,可以if (Interlocked.CompareExchange(ref isStop, 0, 0) != 0) 我是用一个do{}while()循环来判断是否跳出上面的循环,结束掉线程的。// 停止信号 protected static int isStop;do{//压入队列}while(数据库返回结果 > 0 );// 上面的数据库查询结果为0 ,则检查队列内是否还有数据,没有则跳出,程序执行完毕,线程关闭while (true){ if (warningListQueue.Count == 0) { System.Threading.Interlocked.Increment(ref isStop);//线程停止信号 break; } Thread.Sleep(5000);}Thread.Sleep(10000); // 避免多线程未执行完,主线程等10秒钟再停止 Interlocked.Decrement(ref isStop);// 修改信号值 vs2005 中读取web.config 中的连接字符串 C#启动外程序但不显示窗体,怎么弄 关于c# 委托与vc 中函数指针问题 在线等 如何判断读取出来的空值啊?求救!急! 求 开发流程图!!! 求助啊,treeview到底怎么与数据库绑定啊 C#使用进度条ProgressBar和定时器Timer控 100分求DATAGRID的问题! 如何将2幅jpg图象合并成一个jpg文件? 在C#中OLE技术不能用了,请问有什么替代OLE的办法吗? 怎么实现C# 调用 cmd telnet 但不显示telnet窗口 C#应程序第一次启动拍照功能可行,关闭重新打开程序就无法启动视频设备
所以4个DoCheck其实是一模一样的在跑同一个过程?
这样设计有什么意义么...
有一个主线程负责向队列里压数据,4个线程负责跑这个队列。
只为提供执行效率。
问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?
而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.
而且此处IO操作必须是对不同的资源进行操作.
否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行.
注意是 多个同时操作同一个对象
有一个主线程负责向队列里压数据,4个线程负责跑这个队列。
只为提供执行效率。
问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?
而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.
而且此处IO操作必须是对不同的资源进行操作.
否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行.声明的队列是一个全局变量,所以压入和弹出都要加锁的。
数据压入的速度远大于数据弹出的速度。
数据读出来后是要做复杂的操作的,程序中的瓶颈不是主线程压入队列的效率低,是对队列中的数据做操作的效率低。
会进行复杂的IO操作。
if (Thread.VolatileRead(ref isStop) != 0)如果坚持用Interlocked,可以
if (Interlocked.CompareExchange(ref isStop, 0, 0) != 0)
我是用一个
do{}while()
循环来判断是否跳出上面的循环,结束掉线程的。// 停止信号
protected static int isStop;
do{
//压入队列
}while(数据库返回结果 > 0 );// 上面的数据库查询结果为0 ,则检查队列内是否还有数据,没有则跳出,程序执行完毕,线程关闭
while (true)
{
if (warningListQueue.Count == 0)
{
System.Threading.Interlocked.Increment(ref isStop);//线程停止信号
break;
}
Thread.Sleep(5000);
}Thread.Sleep(10000); // 避免多线程未执行完,主线程等10秒钟再停止
Interlocked.Decrement(ref isStop);// 修改信号值