首页 文章 精选 留言 我的

精选列表

搜索[c/c ],共10000篇文章
优秀的个人博客,低调大师

基于无锁的C#并发队列实现

最近开始学习无锁编程,和传统的基于Lock的算法相比,无锁编程具有其独特的优点,Angel Lucifer的关于无锁编程一文对此有详细的描述。 无锁编程的目标是在不使用Lock的前提下保证并发过程中共享数据的一致性,其主要的实现基础是CAS操作,也就是compare_and_swap,通过处理器提供的指令,可以原子地更新共享数据,并同时监测其他线程的干扰,.Net中的对应实现是InterLocked.CompareExchange函数。 既然不使用Lock,那在无锁编程中要时刻注意的是,代码可能在任意语句中被中断。如果是单个变量,我们可以使用 InterLocked.XXX 保证操作的原子性,但是如果有多个操作要完成的话,简单地组合 InterLocked.XXX 是远远不够的。通常的原则是对函数中用到的共享变量,先在代码开始处用局部变量保存它的内容,在后面更新共享变量时,使用前述变量来判断其是否发生了改变,如果共享变量发生了改变,那么我们可能需要重试,或者在某些可能的情况下,当前线程可以"帮助"其他更新中的线程完成更新。 从上面可以总结出无锁算法的两个基本特征: 1. 无锁算法总是包含一个循环结构,以保证更新失败后重试 2. 无锁算法在更新共享变量时,总是使用CAS和原始值进行比较,以保证没有冲突 下面是按照Michael-Scott算法实现的并发队列,其中的Dequeue算法在IBM的非阻塞算法一文中有详细介绍。代码如下: Code 根据自己的测试(双核CPU),在轻度和中度争用情况下,无锁算法比基于锁的算法性能好很多,在争用非常严重的情况下(100个并发线程以上/每CPU),基于锁的算法性能开始显示出优势,因为一旦发生争用,基于锁的算法会立刻切换到其他线程,而无锁算法会进入下一次循环,导致CPU的占用。但是如此严重的争用在实际中并不多见,并且可以采用SpinWait的方法加以改进。基于锁的算法在测试中曾经出现过类似死锁的现象,无锁算法则完全没有出过类似问题,另外,处理器核心越多,基于锁的算法效率越差。 从上面的算法实现中,可以体会到无锁算法的优势:在并发的多个线程中,总是有线程能够推进,算法总能在有限的循环次数内完成,并且在某些冲突的情况下,一个线程可以“帮助”其他线程完成被中断的工作,这些对提高吞吐量都有很大的作用。

优秀的个人博客,低调大师

C# 获取QQ好友列表信息的实现

分析部分 当我们访问QQ空间的时候,大家可以在右侧的发现一个这样的统计信息 当点击这个链接的时候,会跳转到这样一个URL这个URl可以管理好友,当然也就能读取到好友 上面我们是在浏览器中的操作,接下来看看数据到底怎么获取的,我们通过Fiddler的查找功能,就可以查找到web请求和内容信息,我们就会找到如下一个URL,当然Fiddler是在操作之前打开的 通过Fiddler发现返回的是JSON数据,实际的实现是跨域JSON,JSON的结构,是两个数组,一个分组信息,一个好友列表 详细的具体JSON信息,我就不在说了,感兴趣的可以自己去分析 代码实现部分 更具上面的分析,我们首先需要实现数据模型(好友和分组信息) public class QQGroupMemberInfo { public string QQ { get; set; } public string NickName { get; set; } } /// <summary> /// QQ好友 /// </summary> public class QQFriendMember : QQGroupMemberInfo { public int FriendGroupId { get; set; } } /// <summary> /// 好友分组 /// </summary> public class QQFiendGroup { public string Name { get; set; } public int GroupId { get; set; } public int SortId { get; set; } } /// <summary> /// 好友信息返回模型 /// </summary> public class QQFriendInfo { public QQFriendInfo() { GroupInfos = new List<QQFiendGroup>(); QQFriends = new List<QQFriendMember>(); } public List<QQFiendGroup> GroupInfos { get; set; } public List<QQFriendMember> QQFriends { get; set; } } 提交GET请求,获取数据 string friendUrl = string.Format("http://r.cnc.qzone.qq.com/cgi-bin/tfriend/friend_mngfrd_get.cgi?uin={0}", _cleintKeyInfo.ClientUin); string jsonF = GetWebData<string>(friendUrl); 使用Javascript运行时解析数据 StringBuilder script = new StringBuilder(); script.AppendLine("function _Callback(o){return o; };"); script.AppendLine(jsonF); var data = JavaScriptEngine.Run(script.ToString()) as Dictionary<string, object>; 获取解析数据 var gpnames = data["gpnames"] as object[];//组信息 var items = data["items"] as object[];//好友信息 //遍历组 foreach (var g in gpnames) { var gitem = (g as Dictionary<string, object>); qfi.GroupInfos.Add(new QQFiendGroup() { GroupId = int.Parse(gitem["gpid"].ToString()), Name = gitem["gpname"].ToString(), SortId = int.Parse(gitem["sortid"].ToString()) }); } //遍历成员 foreach (var f in items) { var fitem = (f as Dictionary<string, object>); qfi.QQFriends.Add(new QQFriendMember() { FriendGroupId = int.Parse(fitem["groupid"].ToString()), NickName = fitem["name"].ToString(), QQ = fitem["uin"].ToString() }); } 总结 其实QQ的数据是比较好获取的,只是登陆比较困难而已,关于登陆部分实现,我blog前面的一些文章已经实现过了,这里不再罗嗦 对于HTTP协议的数据分析,主要使用HTTP协议分析工具来解析,再结合浏览器的控制台来分析 完整源码:/Files/Rolends/code.rar QQ 讨论组广告群发工具(已开发完成)索引 转载请注明:http://www.cnblogs.com/Rolends

优秀的个人博客,低调大师

再说J.U.C之线程池(一)

[TOC] 线程池的基础架构 Executor executor属于任务的执行者,这个接口只定义了执行任务的一个方法: public interface Executor { void execute(Runnable command); } ExecutorService 这个从名字我们也可以看到这个接口专门为Executor这个执行器来服务的里面有定义线程池的关闭,任务是否执行完毕等一些方法,具体就不这里详细说了。 AbstractExecutorService AbstractExecutorService属于对ExecutorService的抽象实现,我们可以通过看ThreadPoolService的源码来了解下这个抽象类 ThreadPoolExecutor 核心的线程池,我们后面专门详细说 Executors jdk给我们提供了生成线

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册