2015-06-12 刘太华
单线程游戏玩家数据加载方案 我们一直在使用单线程的场景服务器,基本符合由MUDOS发展而来的精简MMO场景服务的模型. 单线程的优点很明显, 安全, 简单, 逻辑清晰, 不会绕死自己的脑细胞, 避免很多多线程下的坑. 但是玩家的数据并不直接由gameserver(也就是scene server, 以下都简称gs)读取, 而是另外一个由python写的服务负责, 这个py服务负责所有玩家需要保存的数据的保存工作, 比如金币, 等级, 各种养成系统。 继续阅读 »
2016-09-28 ruki
线程局部存储(Thread Local Storage,TLS)主要用于在多线程中,存储和维护一些线程相关的数据,存储的数据会被关联到当前线程中去,并不需要锁来维护。。 因此也没有多线程间资源竞争问题,那如何去实现TLS存储呢,主要有以下几种方式: gcc和clang的__thread修饰符 windows下msvc的__declspec(thread)修饰符 pthread库pthread_setspecific和pthread_getspecific接口 windows下的TlsSetValue和TlsGetValue thread和declspec(thread)的使用 其中thread和declspec(thread) 继续阅读 »
2015-04-20 刘太华
一个自带锁的简单队列, 用单向链表实现: template class FastQueue { struct node { T element; node * next; }; node * last; node * first; LOCK m_lock; public: FastQueue() { last = 0; first = 0; } ... // 以下暂省略 继续阅读 »
2015-11-06 Li Shuai
协程是用户态内的,或者准确点说是线程内部的一种上下文切换技术,由于协程切换是在用户态下完成的,所以省去了线程切换时频繁出入内核态的资源开销,可以形成一种很高效的协作式并发技术。 这个简短的视频介绍了一些有关协程、并发之类的东西,很有意义。 Coroutines, event loops, and the history of Python generators 从里面学习到两种很好的协程的调度方式。把代码拿过来分享一下。 Coroutine trampoline 这种方式下的协程调度比较好理解,就是从一个初始状态开始,一条执行线索不断的在多个协程之间切换,就好像多个协程协作完成一项任务。 代码: def co_tramp 继续阅读 »
2012-06-08 Jamling
问题 在Android Email当中,在设置接收服务器和发送服务器时,点击下一步,系统会弹出进度框,并执行服务器设置检验。如果用户设置信息不正确,在执行校验时,大约会花1分钟的时间去校验,最后才会提示设置信息不正确。如果用户在等待过程中点击了“取消”,然后再点下一步,发会现,不再弹出等待提示框,也不执行校验了。 继续阅读 »
2016-03-04 demon7452
Java面试总结-线程 1、创建一个线程 创建线程主要分为两个方法 implements Runnable接口并实现run()方法,然后由Runnable对象创建一个Thread对象,调用Tread的start()方法启动线程。 extends Thread 构建一个Thread类的子类,复写run()方法。该方法目前已不再推荐,应该从运行机制上减少需要并行运行的任务数量。 警告:不要调用Thread类或Runnable对象的run方法。直接调用run方法,只会执行同一个线程中的任务,而不会启动新线程??。应该调用Tread.start方法,这个方法将创建一个执行run方法的新线程。 ``` /** * 创建线程的两种方式 继续阅读 »
2014-05-27 veryyoung
ThreadLocal是什么 早在JDK 1.2的版本中就提供java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路。使用这个工具类可以很简洁地编写出优美的多线程程序。 ThreadLocal很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocal并不是一个Thread,而是Thread的局部变量,也许把它命名为ThreadLocalVariable更容易让人理解一些。 当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 继续阅读 »
2016-11-01 JustWe
Handler - Message - Looper 说起来也就是这么一回事,Looper实现在Thread中负责不断的循环监听处理Message,要不然Thread运行完就自己关了。当你不需要的时候就可以把Looper关了,线程就自动运行完了。 Message 实现了序列化接口,what区分类型,arg的参数使用简单的整形,obj存储对象,data存储一个bundle,target是一个Handler。剩下的就是搞了个对象池回收Message,所以才会推荐用Message.obtain()来新建,其实就是从回收池里拿东西。 总之没什么好说的。 Looper ``` java 继续阅读 »
2015-09-12 刘太华
游戏的场景服务和数据服务整合 一直以来都觉的现在运行的游戏后台服务, 实在太多了。 1,数据服务和场景服务之间的通信, 用的是消息队列zeroMQ来做的, 无形就多了一个消息队列服务, 然后还有一个处理队列任务的mq_worker, 然后数据服务到场景服务的通信. 2, 需要在每次需要的时候都建立一次本地的socket,就2个服务之间,产生了多余的好多事情。 继续阅读 »
2016-04-28 Li Shuai
写Python多线程都知道当前线程调用a.join()后,会阻塞直到线程a运行结束,看了一下threading模块的源码, 了解了一下实现的原理。 每一个新开启的线程内部都维护着一个Condition类型的条件变量,对线程a进行join(),其实是wait()在线程a 内部的条件变量上,当线程a执行结束时,会通过notify_all()通知所有join()的线程,则阻塞的线程被唤醒,恢复执行。 以下是源码: self.__block = Condition(Lock()) #线程内部维护的Contition变量 def __stop(self): if not hasattr(self, '_Thread__block 继续阅读 »