全局变量,两个线程共享
线程A负责将数据写入全局变量
线程B负责将数据从全局变量检测到有新数据就读出显示出来
我问它们两个线程的运行需要同步吗?
当线程A写入1,2,3,4
这个时候线程B去读到1,2,3
这个时候线程A再写入5,6,7
然后线程B继续显示会是4吧
我再想这个时候需要为对全局变量的访问设置互斥吗?

解决方案 »

  1.   

    两线程中有线程修改共享数据 这种情况需要同步 可用临界区的方法 也可以用Event
      

  2.   

    考虑下
    如果B读到4,而A还没写入5.这个时候你怎么处理的。B还去读5么?这个问题处理好了就行了。其实这也就是互斥操作。
      

  3.   

    啊,还没明白我的意思哪,我的意思是,你自己能用自己的方式处理好的话,就用不到临界区,互斥量之类的方法。因为最终结果都是为了程序稳定正确的运行。
    自己的方法也好,临界区也好,互斥量也好,都是其中的一种解决方式而已。这个不需要有疑问啊,只要你程序能正确稳定的运行,什么方法都是可以的。
    当然,大伙平常都习惯用临界区互斥量或信号量来控制线程共同访问的区域,看个人喜好了。我有时候懒,我就直接一个BOOL量来控制线程,只要不出错。我也就这样用了。哈哈。
    对于线程控制精度要求很高的 我通常还是采用临界区互斥量或信号量来控制的。毕竟程序发出去跑挂了总不好看。
      

  4.   

    不好意思 ,没注意到你这个条件 "线程B负责将数据从全局变量检测到有新数据就读出显示出来 "
    如果有这样的需求的话是要考虑的,因为写的线程是不断的写的,而读的线程应该有感觉这个数据被写了的
    能力,使用事件内核对象可以满足你的需求。要用到两个事件一个是写线程使用来等待读线程读完数据然后继续写的,另外一个事件是用来通知读线程有新的数据写完成里的.伪代码如下:事件对象:
    Event1,Event2写线程:WaitFor(Event1)

      写数据的代码
      SetEvent(Event2)
    }读线程:
    WaitFor(Event2)
    {
      把数据取走
      SetEvent(Event1)//通知写线程数据已经拷贝走了可以写数据了。
    }
      

  5.   

    伪代码如下: 事件对象: 
    Event1,Event2 写线程: WaitFor(Event1) 

      写数据的代码 
      ResetEvent(Event1)
      SetEvent(Event2) 
    } 读线程: 
    WaitFor(Event2) 

      把数据取走 
      ResetEvent(Event2)
      SetEvent(Event1)//通知写线程数据已经拷贝走了可以写数据了。