Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#内存模型、锁定和同步_C#_Multithreading_Locking_Shared Memory_Memory Model - Fatal编程技术网

c#内存模型、锁定和同步

c#内存模型、锁定和同步,c#,multithreading,locking,shared-memory,memory-model,C#,Multithreading,Locking,Shared Memory,Memory Model,c#内存模型是否保证持有锁的线程可以看到所有执行的更新,而其他线程以前持有相同的锁 我一直在阅读c#规范,但似乎找不到这方面的细节。锁定只是暂停其他需要锁定的线程。这保证只有一个线程执行共享数据的更新 当解除锁定后,另一个线程可以更新数据,它将看到前一个线程的更新。锁定只是暂停需要锁定的其他线程。这保证只有一个线程执行共享数据的更新 解除锁定后,另一个线程可以更新数据,它将看到前一个线程的更新。是,受某些限制。有关详细信息,您要查找的部分是3.10。是,受某些限制。有关详细信息,您要查找的部分是

c#内存模型是否保证持有锁的线程可以看到所有执行的更新,而其他线程以前持有相同的锁


我一直在阅读c#规范,但似乎找不到这方面的细节。

锁定只是暂停其他需要锁定的线程。这保证只有一个线程执行共享数据的更新


当解除锁定后,另一个线程可以更新数据,它将看到前一个线程的更新。

锁定只是暂停需要锁定的其他线程。这保证只有一个线程执行共享数据的更新


解除锁定后,另一个线程可以更新数据,它将看到前一个线程的更新。

是,受某些限制。有关详细信息,您要查找的部分是3.10。

是,受某些限制。有关详细信息,您要查找的部分是3.10。

将提供直观的解释:如果未提供该保证,则无法实现锁定

进行正式解释:CLI规范(Ecma 335)第I.12.6.5章:

获取锁(System.Threading.Monitor.Enter或进入同步方法)应 隐式执行易失性读取操作,并释放锁 (System.Threading.Monitor.Exit或离开同步方法)应隐式执行 易失性写操作

易失性读取具有“获取语义”,这意味着读取保证在任何 对CIL指令序列中读取指令之后发生的内存的引用。A. volatile write具有“release semantics”,这意味着写操作保证在任何 在CIL指令序列中写入指令之前的内存引用


按照直观的解释:如果没有提供这种保证,那么就无法实现锁

进行正式解释:CLI规范(Ecma 335)第I.12.6.5章:

获取锁(System.Threading.Monitor.Enter或进入同步方法)应 隐式执行易失性读取操作,并释放锁 (System.Threading.Monitor.Exit或离开同步方法)应隐式执行 易失性写操作

易失性读取具有“获取语义”,这意味着读取保证在任何 对CIL指令序列中读取指令之后发生的内存的引用。A. volatile write具有“release semantics”,这意味着写操作保证在任何 在CIL指令序列中写入指令之前的内存引用


好的相关文章:@Servy优秀的文章谢谢好的相关文章:@Servy优秀的文章谢谢你能详细介绍一下吗?具体地说,这一节讨论了执行顺序,但似乎不能保证副作用对其他线程的可见性。这一节是关于副作用的可见性的,所以我不明白您要我澄清什么。如果你担心的话,一个锁会导致一个完整的围栏。@mikez是的,它说所有关键部分都会保留在它们之前发生的副作用的顺序,然后将锁列为关键部分。谢谢你给我指出了正确的地点埃里克,我找不到它来救我的命:你能详细说明一下吗?具体地说,这一节讨论了执行顺序,但似乎不能保证副作用对其他线程的可见性。这一节是关于副作用的可见性的,所以我不明白您要我澄清什么。如果你担心的话,一个锁会导致一个完整的围栏。@mikez是的,它说所有关键部分都会保留在它们之前发生的副作用的顺序,然后将锁列为关键部分。谢谢你给我指出了正确的位置埃里克,找不到它来救我的命:这不是所有的锁都能做到的。它们还引入了内存障碍,这一点很重要。锁并不都是这样做的。它们还引入了内存障碍,这一点很重要。感谢您提供了出色的代码片段,尽管我认为即使使用函数锁,您也可以尝试读取过时的数据。我越想,如果数据过时,你就不会知道锁被释放了。不确定锁是否可能不过时,以及其他一些副作用是否可能过时,这就是重新排序的世界,但疯狂的事情发生了:)感谢您提供了出色的代码片段,尽管我认为,即使使用函数锁,您也可以尝试读取过时的数据。我越想,如果数据过时,你就不会知道锁被释放了。不确定锁是否可能不过期,其他一些副作用是否可能过期,这就是重新排序的世界,但疯狂的事情发生了:)