none
线程同步为啥叫同步,按照实际情况来说,叫"线程协调"不是更准确些 RRS feed

  • 问题

  • 学了半天所谓的线程同步,发现实际上做的事情就是限制某个资源在某个时间段下只能有一个线程访问,请问到底哪里同步了,谁和谁同步了呢?这种操作,理解上是否称之为"线程协调"更合理些

    请高手们指点,是否我学习的不够全面还是本身线程同步就是如此

    2011年1月9日 15:41

答案

  • dear
    同步也可以解释为顺序启动,比如主线程呼叫了,线程A、线程B、线程C,主线程需要取得这三个线程的的结果,主线程需要等待ABC都执行完后,才能取得确的运算结果;锁定也是一种等待的行为,使用锁定后,线程的状态会变成WaitSleepJoin,请参考

    [Thread] 執行緒狀態- Thread.ThreadState
    http://www.dotblogs.com.tw/yc421206/archive/2011/01/05/20599.aspx

    总之只要有发生等待行为的,就叫做同步,反之稱异步。
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年1月10日 2:06
  • 您好,您的理解没有问题。同步作为一个术语被沿用至今。

    站在资源的角度似乎不好理解谁和谁同步了,但如果站在调用方的角度来理解,同步实际上是表明会阻塞调用方所在的线程,它与调用方的代码保持同步,即调用后必须等待返回的结果。反之,如果是异步,则不会阻塞调用方的代码,调用方相当于发了一个指令,然后就继续执行下面的代码,无须等待发出指令后的返回结果。

    2011年1月10日 6:25
    版主
  • lypython 您好,

     

    线程同步的作用是协调对资源的访问,当两个或两个以上的线程同时访问相同资源,如果每个线程对于其他线程的操作是未知的,那么将会对数据造成损坏。之前Jiyuan提到的从调用方法的角度来理解线程同步,是很好的一种方法。在C#中,有同步事件,也可以通过它来帮助理解线程同步。同步事件有两个状态(终止和非终止)的对象,可以用来激活和挂起线程。让线程等待非终止的同步事件可以将线程挂起,将事件状态更改为终止可以将线程激活。如果线程试图等待已经终止的事件,则线程将继续执行,而不会延迟。

    其实线程同步的主要作用是协调,我们可以从不同的角度对它进行理解。

    另外,具体的一些理解和例子,也可以参考这个关于线程同步的文章:http://msdn.microsoft.com/zh-cn/library/ms173179(v=vs.80).aspx

     

    希望这些对您有所帮助,

    Mio


    Mio Miao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月14日 9:42
    版主

全部回复

  • dear
    同步也可以解释为顺序启动,比如主线程呼叫了,线程A、线程B、线程C,主线程需要取得这三个线程的的结果,主线程需要等待ABC都执行完后,才能取得确的运算结果;锁定也是一种等待的行为,使用锁定后,线程的状态会变成WaitSleepJoin,请参考

    [Thread] 執行緒狀態- Thread.ThreadState
    http://www.dotblogs.com.tw/yc421206/archive/2011/01/05/20599.aspx

    总之只要有发生等待行为的,就叫做同步,反之稱异步。
    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2011年1月10日 2:06
  • 你说的这种情况是线程的竞争,有个书上的章节上写的就是线程的同步与竞争。

    同步一般指生产者消费者问题吧。比如,线程a生产、线程b消费、线程a生产、线程b消费,这样2个线程是同步的。

    在竞争问题中,看起来不明显但其实也是一样的,(a线程lock(m),b线程unlock(m)),在这个点上它们2个线程同步,也就是说如果a执行太快就会等待,当然b执行太快需要另一个锁来解决。

    但总的来说这些问题都是同步,就像无论什么都可以用pv原语来解决。

    2011年1月10日 3:07
  • 您好,您的理解没有问题。同步作为一个术语被沿用至今。

    站在资源的角度似乎不好理解谁和谁同步了,但如果站在调用方的角度来理解,同步实际上是表明会阻塞调用方所在的线程,它与调用方的代码保持同步,即调用后必须等待返回的结果。反之,如果是异步,则不会阻塞调用方的代码,调用方相当于发了一个指令,然后就继续执行下面的代码,无须等待发出指令后的返回结果。

    2011年1月10日 6:25
    版主
  • 请参考我写过的一篇文章 What's actually sychronous and asynchronous operations,从我的博客 http://www.markzhou.com/blog/post/What-are-actually-synchronousasynchronous-operations-(C-50-Series).aspx。我主要是讲了几个理解误区,请仔细阅读。


    Mark Zhou
    2011年1月10日 9:28
  • lypython 您好,

     

    线程同步的作用是协调对资源的访问,当两个或两个以上的线程同时访问相同资源,如果每个线程对于其他线程的操作是未知的,那么将会对数据造成损坏。之前Jiyuan提到的从调用方法的角度来理解线程同步,是很好的一种方法。在C#中,有同步事件,也可以通过它来帮助理解线程同步。同步事件有两个状态(终止和非终止)的对象,可以用来激活和挂起线程。让线程等待非终止的同步事件可以将线程挂起,将事件状态更改为终止可以将线程激活。如果线程试图等待已经终止的事件,则线程将继续执行,而不会延迟。

    其实线程同步的主要作用是协调,我们可以从不同的角度对它进行理解。

    另外,具体的一些理解和例子,也可以参考这个关于线程同步的文章:http://msdn.microsoft.com/zh-cn/library/ms173179(v=vs.80).aspx

     

    希望这些对您有所帮助,

    Mio


    Mio Miao[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年1月14日 9:42
    版主