none
.net当中的EventWaitHandle本身是线程安全的吗? RRS feed

  • 问题

  • 比如有三个线程共享使用一个ManualResetEvent实例mre,三个线程的代码序列里面都使用了它,并在不同的地方调用了mre.WaitOne    mre.Set()    mre.ReSet()等语句。那么这是mre本身也成为线程间的临界资源被使用。在msdn上有关EventWaitHandle类最下边又说明:

    “此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。”

    问题一:

    那么是不是说mre此时也并非线程安全的?如果不是线程安全的我又为什么可以信赖由它管理的线程代码?

    问题二:

    绝大部分msdn实例下面都会写好该类或方法是不是线程安全的,但我不太明白它的意思?能举个例子吗?(最好把里面用到的词汇都说明下)


    shan423

    2012年6月8日 2:04

答案

  • 关于此类解释MSDN中英文也不一致。

    .NET framework 2.0

    “此类型的任何公共静态(Visual Basic 中的 Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。”

    .NET framework 3.0

    MSDN的英文跟中文的解释是不一样的

    英文是:“This type is thread safe.” 

    中文还是跟2.0一样。

    .NET framework 3.5及其以后,

    MSDN的英文跟中文的解释是一样的:“此类型是线程安全的。”

    关于2.0的文件,用reflector看了一下你上面的几个方法,可惜最后的实现都是非托管代码,看不到。不过我觉得就算是2.0,你文中提到的几个方法的非托管现实也应该是线程安全的。


    • 已编辑 Jacky_shen 2012年6月8日 15:06
    • 已标记为答案 shan423 2012年6月10日 5:23
    2012年6月8日 15:03