本帖最后由 cnsjd 于 2009-10-26 11:46:38 编辑

解决方案 »

  1.   


                       //如果有空位子,则对队列加锁,准备写入数据 
                        //把缓冲区加锁 
                        lock (thisLock) 
                        { 
                            //模拟下载 
                            Thread.Sleep(500);                         //写入一个编号 
                            list.Enqueue(download + 1);                         //更新统计信息 
                            download++; 
                            //注意,对记录着缓冲区中文章个数的变量count的写操作必须进行同步 
                            Interlocked.Increment(ref count);                         //报告 
                            Console.WriteLine("1 file downloaded.NO.{0}, Content:{1}", download, download); 
                        } 
    lock()//试图获取锁:thisLock;如果锁正在被其线线程使用则等待直到获取锁后才继续执行lock(){}里面的代码,所以{}中的代码是线程安全的;Interlocked.Increment(ref count); 可以直接改为:count++;
      

  2.   

    能详细点不?是不是 锁只有一个,,执行2个函数的线程都在抢这把锁?抢到才能执行LOCK内的代码??是不?
    还有就是lock (thisLock)  和 lock (this)  有何区别?
    此例中 Interlocked.Increment(ref count); 可以直接改为:count++;  确定???
      

  3.   

    lock可以把一段代码定义为互斥段(critical section),互斥段在一个时刻内只允许一个线程进入执行,而其他线程必须等待
     生产者和消费者 
      

  4.   


    lock(thisLock)是对thisLock加锁,lock(this)是对整个的this对象加锁,
    Interlocked.Increment(ref count); 可以直接改为:count++;  确定???Interlocked类的方法可以防止可能在下列情况发生的错误:计划程序在某个线程正在更新可由其他线程访问的变量时切换上下文;或者当两个线程在不同的处理器上并发执行时。此类的成员不引发异常。Increment 和 Decrement 方法递增或递减变量并将结果值存储在单个操作中。在大多数计算机上,增加变量操作不是一个原子操作,需要执行下列步骤: 将实例变量中的值加载到寄存器中。增加或减少该值。在实例变量中存储该值。如果不使用 Increment 和 Decrement,线程会在执行完前两个步骤后被抢先。然后由另一个线程执行所有三个步骤。当第一个线程重新开始执行时,它覆盖实例变量中的值,造成第二个线程执行增减操作的结果丢失。Exchange 方法自动交换指定变量的值。CompareExchange 方法组合了两个操作:比较两个值以及根据比较的结果将第三个值存储在其中一个变量中。比较和交换操作按原子操作执行。但我一般都没用过此类,只要加了锁,我就直接对共享的变量进行操作,当然用了此类更加的安全,
      

  5.   

    发现一篇 好文,,大家可以看看 http://xxinside.blogbus.com/logs/46441956.html
    结贴了,,谢谢各位~~~
      

  6.   

    各位高手帮帮忙 有在线的吗 我要做一个实训报告 内容是 Linux环境下生产者、消费者程序实例的编辑、编译、调试及运行过程。