相关帖子http://www.csdn.net/expert/topic/1061/1061819.xml?temp=.7534296
首先感谢oldworm介绍我看《Windows核心编程》,可是关于线程中还是有几个问题搞不太清楚。所以提出来,看看各位大哥大姐有何高参。
1,在线程中的同步是一个什么样的概念,它的作用是什么?什么情况下需要同步,什么情况下不需要?
2,多个线程同时访问共享资源,其结果是无法预料的,所以有很多办法可以防止多个线程同时对共享数据进行操作。这和同步是一个概念吗?如果不是,有何联系,区别呢?总之,我会继续看《Windows核心编程》,也希望大家能指点一二。

解决方案 »

  1.   

    比如有两个线程t1和t2,t1负责把某个数据取出来放在一个缓冲区内,由t2从缓冲区取出处理。这样t2可能要执行一个循环,在缓冲区内没有数据的时候,需要停下来,等待t1完成任务才继续执行。这种情况是同步。如果一个线程需要等待其他线程,则需要同步。避免同时访问共享资源一般叫互斥,和同步不一样。
      

  2.   

    在使用多线程编程时,还有一个非常重要的问题就是线程同步。所谓线程同步是指线程之间在相互通信时避免破坏各自数据的能力。同步问题是由前面说到的Win32系统的CPU时间片分配方式引起的。虽然在某一时刻,只有一个线程占用CPU(单CPU时)时间,但是没有办法知道在什么时候,在什么地方线程被打断,这样如何保证线程之间不破坏彼此的数据就显得格外重要。在MFC中,可以使用4个同步对象来保证多线程同时运行。它们分别是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CSemaphore)和事件对象(CEvent)。在这些对象中,临界区对象使用起来最简单,它的缺点是只能同步同一个进程中的线程。另外,还有一种基本的方法,本文称为线性化方法,即在编程过程中对一定数据的写操作都在一个线程中完成。这样,由于同一线程中的代码总是按顺序执行的,就不可能出现同时改写数据的情况。
      

  3.   

    多看几遍《Windows核心编程》里面的一些实例,调试一下就明白了。
      

  4.   

    我认为线程的同步主要是从资源访问上来说的,如果子线程不与别的线程交互,比如启动它后让它和客户端独立通信。在同步中了解一下P,V操作很有用处,它确实是分时使用cpu的结果。说真的,内容很多seabank(雨人) 的说法以临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CSemaphore)和事件对象(CEvent)为提纲系统的了解吧。他们使用的场合也是同步的关键。
      

  5.   

    我最近也在看,改天向你请教xiao_980800 (叶子飞) ,呵呵,我就快要解决我的问题了(关于线程)。你快是个高手了
      

  6.   

    说真的,线程同步的内容很多,对全局变量的访问应该不需要同步吧,原则上同步是为了防止线程一对变量的改变,而线程二不知道,这是互斥访问。一个时刻只有一个线程访问对象,
    信号量是一种异步机制,就是pv操作了,当两个线程,a发生了,b才能运行就需要对b的开始调用p(wait)操作,而a的结尾调用v(single)操作,b运行到wait,如果a没结束,b就阻塞,a结束调用v操作,会唤醒阻塞的b线程。要想系统的了解,建议看一下操作系统,pv操作的参数就是临界区对象(CCriticalSection)、互斥量对象(CMutex)、信号量对象(CSemaphore)和事件对象(CEvent),
      

  7.   

    摘自:http://home.njau.edu.cn/~xuzhongguo/vc5/Chap12.html
    使用多线程可以带来一些非常有趣的问题。例如,如何防止两个线程在同一时间访问同一数据?例如,假设一个线程正在更新一个数据集,而同时另外一个线程正在读取数据集,结果如何?第二个线程将会读取到错误的数据,因为数据集中只有一部分元素被更新过。
    保持在同一个进程内的线程工作协调一致称之为线程同步。Event对象实际上就是线程同步的一种形式。在本节中,你将会学到三种使你的多线程程序更安全的线程同步对象—critical section、互斥对象(mutex)、信号量(semaphore)。他说:保持在同一个进程内的线程工作协调一致称之为线程同步。而言下之意,如何防止两个线程在同一时间访问同一数据的问题属于同步问题。如果是这样我就搞清楚两都之间的联系了。当然,协调一致还涉及到其它问题,比如CPU分配不均。
    不知道我这样理解对了吗?