运行OK就没问题,运行不OK就肯定有问题,代码又不是看出结果的,实践出真知

解决方案 »

  1.   

    加了Lock,其它线程是访问不到的。创建它的线程可以访问。
      

  2.   

    访问到的,Lock 只是锁对象,不会锁方法的调用啊。
      

  3.   

    主要是看要不要枷锁啊,逻辑OK运行就OK。
      

  4.   

    4个DoCheck都没有参数?
    所以4个DoCheck其实是一模一样的在跑同一个过程?
    这样设计有什么意义么...
      

  5.   


    有一个主线程负责向队列里压数据,4个线程负责跑这个队列。
    只为提供执行效率。
    问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?
    而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.
    而且此处IO操作必须是对不同的资源进行操作.
    否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行.
      

  6.   

    Lock 是针对于多个线程访问操作同一对象时才Lock···加锁···
    注意是  多个同时操作同一个对象
      

  7.   


    有一个主线程负责向队列里压数据,4个线程负责跑这个队列。
    只为提供执行效率。
    问题是你把队列的执行过程lock住了,每次只能有一个线程去处理队列,这跟一个线程循环跑有什么区别么?
    而且因为CPU要对线程进行上下文切换,所以效率更低.除非是每次线程需要从队列取数据并进行相应的IO操作,IO操作比较费时,才会用你的办法.
    而且此处IO操作必须是对不同的资源进行操作.
    否则你要写入同一个文件,同一个串口或同一个网络连接,仍然不行.声明的队列是一个全局变量,所以压入和弹出都要加锁的。
    数据压入的速度远大于数据弹出的速度。
    数据读出来后是要做复杂的操作的,程序中的瓶颈不是主线程压入队列的效率低,是对队列中的数据做操作的效率低。
    会进行复杂的IO操作。
      

  8.   

    GetDequeue没有问题,但把 if (!Interlocked.Equals(isStop, 0))换成比如VolatileRead:
    if (Thread.VolatileRead(ref isStop) != 0)如果坚持用Interlocked,可以
    if (Interlocked.CompareExchange(ref isStop, 0, 0) != 0)
      

  9.   


    我是用一个
    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);// 修改信号值