您的位置:首页 > 编程语言 > C#

C#中线程锁的一点理解

2017-08-22 16:12 309 查看
原文地址:http://www.cnblogs.com/apsnet/archive/2012/07/08/2581475.html

这一篇文章并不是全部正确的,lock(objectA){codeB} 为lock的格式。文章提出objectA与codeB将同时被锁定无法访问。然而事实上objectA更像是作为一个标志位,也可以成为互斥锁。当objectA第一次被锁定的时候,只有codeB执行结束才会解开锁。这时候,如果有其他想要使用codeB内容的线程才能再次锁上objectA,继续执行codeB.。可以参考原文的评论区!参考原文的评论区!参考原文的评论区!

自己举个例子,之前看到的网络编程的例子,网络编程文章地址:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part4.aspx



在这个例子里,首先明确网络流streamToClient目前只有一个,也就是网络端当前只有连接到一个客户端。异步读取网络流的内容,lock把streamToClient这个networkstream锁住,streamToClient这个阶段就只能被当前分线程调用,这个时候如果其他线程要读取网络流内容,就会调用方法BeginRead() 接着继续异步读取,档执行到lock时,判断,当前网络流正在被使用,被锁住了。就会等待正在使用的线程执行完毕解开锁,然后其他线程才锁住网络流继续读取。

(一个服务器端和一个客户端只有一个networkstream,但是可能有不同的线程同时异步传递数据,此举保证某个线程能稳定的接收数据)

参考官方文档:https://msdn.microsoft.com/zh-cn/library/c5kehkcz(VS.80).aspx
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: