游戏中的每一个房间需要独占线程一个线程吗

线程在Linux中的实现
线程在Linux中的实现
编辑:www.fx114.net
本篇文章主要介绍了"线程在Linux中的实现",主要涉及到线程在Linux中的实现方面的内容,对于线程在Linux中的实现感兴趣的同学可以参考一下。
& & & 早在以前,我们就知道,CPU调度的基本单位是线程,而进程是拥有资源的基本单位,进程是用进程描述符表示的,那么线程是怎么实现和表示的呢?& & & 线程机制是现代编程技术中常用的一种抽象概念.该机制提供了在同一程序内共享内存地址空间运行的一组线程.这些线程还可以共享打开的文件和其他的资源(都是指进程的)。线程机制支持并发程序设计技术,在多处理器系统上,它也能保证真正得并行处理。& & &下面,首先看下面张图:(画的很不好看,很是惭愧)& & & 这张图中,可以看出进程和线程是一样的,只是进程比线程要大,而且它们指向相同的内存地址空间,这是为什么?& & & Linux实现线程的机制非常独特。从内核的角度说,他并没有线程这个概念。Linux把所有的线程都当做进程来实现。内核并没有准备特殊的调度算法或者是定义特别的数据结构来表征线程。相反,线程仅仅被视为一个与其他进程共享某些资源的进程。每个线程都拥有唯一隶属于自己的 task_struct ,所以在内核中,它看起来像是一个普通的进程(只是它和其他一些进程共享某些资源,如地址空间),只是它并没有自己独立的内存地址空间。& & & 上述线程机制的实现和 Microsoft Windows 等操作系统的实现差异非常大。这些系统都在内核中提供了专门支持线程的机制(这些系统常常把线程称作是轻量级进程)。“轻量级进程”这种叫法本身就概括了Linux与其他系统的差异。& & & 加入现在需要一个包含四个线程的进程,在提供专门支持线程的系统中,通常会有一个指向四个不同线程的指针的进程描述符。该描述符负责描述像地址空间,打开的文件这样的共享资源。线程本身再去描述它独占的资源。相反,Linux仅仅创建四个进程并分配四个普通的 task_struct 结构。建立这四个进程时指定它们共享某些资源,这是相当高雅的做法。
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:Java相关(5)
作者:华清远见
在我们的操作系统上运行着很多的计算机程序,每一个计算机程序可能都包含一个或多个独立的线程,而这些线程若访问我们系统上的共享资源时,比如说:内存资源、文件资源、数据库资源等。可能会使得各线程之间访问资源时产生冲突。那我们如何来解决这种问题呢?Java中存在这么几种处理方式:同步代码块、同步方法、同步锁等。
一、同步代码块
同步代码块格式:synchronized(key){
//存放同步代码块;
如何来理解同步代码块呢?打个比方:一个object就像一个大房子,大门永远打开。房子里有很多房间(也就是方法)。这些房间有上锁的(synchronized方法),和不上锁之分(普通方法)。房门口放着一把钥匙(key),这把钥匙可以打开所有上锁的房间。另外我把所有想调用该对象方法的线程比喻成想进入这房子某个房间的人。所有的东西就这么多了,下面我们看看这些东西之间如何作用的。
一个人想进入某间上了锁的房间,他来到房子门口,看见钥匙在那儿(说明暂时还没有其他人 要使用上锁的房间)。于是他走上去拿到了钥匙,并且按照自己的计划使用那些房间。注意一点,他每次使用完一次上锁的房间后会马上把钥匙还回去。即使他要连 续使用两间上锁的房间,中间他也要把钥匙还回去,再取回来。
因此,普通情况下钥匙的使用原则是:“随用随借,用完即还。”
这时其他人可以不受限制的使用那些不上锁的房间,一个人用一间可以,两个人用一间也可以,没限制。但是如果当某个人想要进入上锁的房间,他就要跑到大门口去看看了。有钥匙当然拿了就走,没有的话,就只能等了。
当多线程抢占方法体内的资源时,只有获取key这个对象的线程才可以获得并执行方法体中的内容,其它的线程必须等待这个线程执行完毕后归还key对象,才可以申请获得这个key来抢占资源。
二、同步方法
同步方法的语法格式:public synchronized 数据返回类型 方法名(){} 。就是使用 synchronized 这个关键字来修饰某个方法,则该方法称为同步方法。对于同步方法而言,无需显示指定同步监视器,这个同步监视器也就是同步代码块中的“key”;同步方法的同步监视器是 this 也就是当前对象,通过使用同步方法,可非常方便的将某类变成线程安全的类,具有如下特征:
1,该类的对象可以被多个线程安全的访问。
2,每个线程调用该对象的任意方法之后,都将得到正确的结果。
3,每个线程调用该对象的任意方法之后,该对象状态依然保持合理状态。
注:synchronized关键字可以修饰方法,也可以修饰代码块,但不能修饰构造器,属性等。
三、同步锁
在Jdk1.5之后,java提供了一个强大的线程同步机制:通过显式定义同步锁对象来实现同步,在这种机制下,同步锁由Lock对象充当。
锁,提供了对共享资源的独占访问,每次只能有一个线程对Lock对象加锁,线程开始访问共享资源之前应该首先获Lock对象。
某些锁可能允许对共享资源并发访问,如ReadWriteLock(读写锁)。Jdk1.8之后新增了新型的StampedLock。它在大多数场景中可以替代传统的ReentranReadWriteLock。为读写操作提供三种锁模式:Writing、ReadingOptimistic、Reading。
当产生Lock对象时,我们可以直接通过Lock对象的lock()方法和unlock()方法就可以实现对资源的上锁和解锁过程。
文章选自华清远见嵌入式培训
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1035669次
积分:18918
积分:18918
排名:第458名
原创:846篇
评论:215条
(1)(33)(26)(18)(24)(23)(12)(13)(2)(1)(2)(1)(1)(7)(5)(3)(1)(2)(1)(2)(3)(1)(5)(2)(13)(4)(3)(4)(2)(3)(1)(2)(1)(6)(4)(5)(3)(4)(3)(3)(2)(4)(2)(4)(4)(4)(5)(3)(6)(4)(5)(5)(12)(10)(6)(6)(13)(2)(2)(9)(13)(3)(12)(20)(16)(10)(8)(15)(15)(13)(15)(17)(18)(12)(14)(20)(27)(6)(19)(23)(18)(22)(35)(30)(23)(34)(35)游戏服务器 多线程 处理大家好,我们现在在开发一个棋牌游戏服务器,服务器有120个房间,原来的服务器程序员在设计服务器架构的时候,在服务器上创建了120个线程,每一个线程处理一个房间内的牌局逻辑(一个房间一局完成估计要花10分钟左右)。这样的设计虽然使得处理房间逻辑变得非常简单而且思路清晰,但是120的线程让CPU在线程之间切换时花费了太多时间,而且如果以后房间数量增加线程数也会增加,所以,这一块需要重构,我的想法是只创建4个线程来处理120个房间的牌桌逻辑,这样的话每一个线程要处理30个房间的牌桌逻辑,请问:如何让每一个线程下的30房间的逻辑处理就像被CPU分配了时间片段一样轮询处理,而不是一个房间的逻辑处理完了再去处理另外一个房间的逻辑,因为120个房间的逻辑处理一直都是出于活动状态。请给出详细的思路,小生在这里谢过大家了。
回答1:你为什么要阻塞处理呢?
其实房间中的每个逻辑并不需要服务端阻塞吧,假设每个玩家请求都是携带了房间信息的,在队列中依次到达,服务端按照心跳依次处理即可
回答2:一个房间的逻辑处理完,在处理另外的房间,并没有什么问题
应该根据一个房间的一次处理逻辑的时间,和最大能容忍的延迟时间,&算出一个线程能处理的最大房间数量,&比如一个房间,处理一次逻辑10ms,&最大允许&1s延迟,&那么一个线程能处理&100个房间
std::list&House$>$house_
//线程处理主函数
void&threadmain()
&&&std::for_each(house_list.begin();&houselist.end();&[&](House&house){
&&&&&&&&house.tick();&//处理一个房间的逻辑
&&&Sleep(1);[求助]在多线程的情况下为每一个线程创建一个MYSQL连接?【已解决】|易语言俱乐部 - 易语言俱乐部 - Powered by phpwind
查看完整版本: [--
[求助]在多线程的情况下为每一个线程创建一个MYSQL连接?【已解决】
请问MYSQL支持库在多线程的情况下是否需要为每一个线程创建一个MYSQL连接?[此贴子已经被作者于 2:22:02编辑过]
不用,连接的耗时相当长,得不偿失
在问下:在多线程的条件下使用查询语句,是否需要置“进入许可证” ,因为执行了SQL语句后还得取记录集,如果在多线程的情况下不使用“进入许可”是否会导致记录集取错成另外一个线程查询的记录集。
多线程的许可证对sql的记录集没有关联。&一般而言,获得记录集之后,你就应该立刻操作,如果你需要等待一段时间再处理,那么在此期间其他线程可能已经刷新了记录集,所以你应该立刻先另外保存下来,例如利用数组。&大致应该是这样了,有段时间没用易写程序了,但之前写过和mysql密切相关的东西,还有一点影响,应该没记错。
以下是引用bmp在 1:55:00的发言:多线程的许可证对sql的记录集没有关联。&一般而言,获得记录集之后,你就应该立刻操作,如果你需要等待一段时间再处理,那么在此期间其他线程可能已经刷新了记录集,所以你应该立刻先另外保存下来,例如利用数组。&大致应该是这样了,有段时间没用易写程序了,但之前写过和mysql密切相关的东西,还有一点影响,应该没记错。
以下是引用bmp在 1:55:00的发言:多线程的许可证对sql的记录集没有关联。&一般而言,获得记录集之后,你就应该立刻操作,如果你需要等待一段时间再处理,那么在此期间其他线程可能已经刷新了记录集,所以你应该立刻先另外保存下来,例如利用数组。&大致应该是这样了,有段时间没用易写程序了,但之前写过和mysql密切相关的东西,还有一点影响,应该没记错。立刻操作取记录集,就算是立刻操作,也不排除其他线程刷新记录集的危险,所以我觉得还是在 取记录集()这个命令 的时候应该创建一个 “进入许可证”
以下是引用comput在 2:10:00的发言:立刻操作取记录集,就算是立刻操作,也不排除其他线程刷新记录集的危险,所以我觉得还是在 取记录集()这个命令 的时候应该创建一个 “进入许可证”&&不是的,进入许可证完全对记录集无影响。&你这样理解,就像一堆记者围着发言人提问一样,记者轮流发问,发言人轮流回答,其中一个记者(线程)发问,发言人回答,这个时候你是独占的,所以如果你需要重新调阅他的发言的话,就必须立刻录音,别指望等他下次发言的时候再听,那时候他已经不是回答你的问题了。而记者证编号(许可证)对于你的应答是毫无关系的,那只是用于辨识这个记者和那个记者之间的差别。[此贴子已经被作者于 2:16:34编辑过]
谢谢bmp了!
那在获取记录集之前保留需要查询的数据,并建立一个许可证,一条一条的往下执行查询语句,应该是可以的吧,在查询之前就把线程排队了,一次只允许一条线程来执行,我想是不会有撒冲突咯
列队线程,一次只允许一条线程,这就已经是“过程”了,那还要“线程”干什么?还要许可证干什么?[此贴子已经被作者于 16:42:14编辑过]
这样的讨论才有意义!支持: bmp
用户被禁言,该主题自动屏蔽!
顶起。。。。
学习了!!!论坛中这样的讨论再多一点就好了!!!
查看完整版本: [--
Powered by
Gzip enabled

我要回帖

更多关于 独占线程计数 的文章

 

随机推荐