m******t 发帖数: 635 | 1 怎么让我想起了ruby里的Fiber,几年前很热闹过一阵,忘了后来怎么样了。
怎么感觉js一副要重走长征路的样子,要把perl, python, ruby的老路子再重来一遍?
加了多线程的话,js的语义会不会有问题啊,以前一直假设单线程的啊? |
|
a*********0 发帖数: 2727 | 2 哥们还是回去好好把os的基础知识学学吧,线程进程的区别是什么都没搞清楚,kernel
-level, user-level thread的区别是什么。忽悠不是cs科班出来的还行,现在码工遍
地,就不要出来现了 |
|
z****e 发帖数: 54598 | 3 这种笑话,当真就搞笑了
多线程搞起来是比较恶心
但是市场如果不需要你去搞
那就是另外一回事了 |
|
z****e 发帖数: 54598 | 4 没有哦
你要告诉我os搞不定多线程的调度还是什么?
你这不是吃饱了撑着嘛 |
|
z****e 发帖数: 54598 | 5 我问的是你的设计里面,会不会因为线程调度而打断
你都没听明白我在问什么
要给你举例吗?
java里面有一个AtomicInteger,我就想知道一下
你这里面是不是做了类似的操作
如果你用的不是AtomicInteger,而是Integer的话
这里面会有调度而产生的一些很trivial的问题
当然int不会有问题,你想过你如何给别人解释这里面的问题了么?
难怪你到现在还在单打独斗
nasdaq平台跟你p关系没有
别吹了,你只是一个送单的 |
|
H**r 发帖数: 10015 | 6 说得好
程序员应该知道多线程是什么,然后用什么工具解决。具体的算法,优化如果都从头走
要累死,而且肯定会有疏忽,然后就挂了。 |
|
z****e 发帖数: 54598 | 7 你文明,我也文明
不说脏话
来来来,我们聊聊多线程
我的立场,我用java,不用任何的synchronized关键字
只用现成的框架,你用go,我们找几个cases来study
各自表述,好吧,看看优劣如何
你说go比java简单,放心,我有信心做到java比你的go设计更简单
更通俗易懂,同样可以避开多线程的陷阱
你要踊跃发言啊 |
|
x****u 发帖数: 44466 | 8 没说到点子上。现在的GUI都是多线程保证流畅的,但逻辑部分是单线程。 |
|
z****e 发帖数: 54598 | 9 多线程的话,一起刷新主界面?
会闪,我看android还是一个主线程在跑 |
|
s****u 发帖数: 1433 | 10 某些地方想简单了是可以修改的。
我就是想提示一下,连订票人都不区分,怎么个订法?
比如10个人买8张票,我肯定知道前8个有票,后
两个没票。问题是卖给谁了啊?
所以,每个ReserveTicket的子线程肯定得有个标识吧。
抢完票以后,ReserveTicket以后,肯定得把
这个结果根据子线程的标识把这个结果记录进数据库吧。
然后,还得通知顾客抢票成功或者失败吧。
产生这些通知的程序在哪里呢?
这些不靠这个CPU同时干么?
这些问题,魏老师打算怎么解决啊? |
|
w***g 发帖数: 5958 | 11 C++没啥好的轻量级线程库。C++11连pthreads,建上几万个线程
就出错了。比go, scala啥的都差大老远了。
python做科学计算也就是做个流程,真正的活都是fortran,C/C++代码,
都已经并行化了的。 |
|
z****e 发帖数: 54598 | 12 好像听谁说过
你说过?
就是硅谷好像都是偏互联网的游戏公司
la多数是偏传统网游
偏互联网的游戏好做啊
你像三国杀这种,就不需要放到内存里面去运行
可以用上一点persistence,可以把session放到cassandra里面去,或者redis?
这样就不怕多线程并发了,也不需要自己启动一个线程去host这一局游戏了
也不怕failover,所以我想知道coltzhao他们是不是这么做的
因为他说用node.js |
|
D***n 发帖数: 6804 | 13 每个基于Lock的sync实现都是像你这样想的,但现实很残酷。
写这么一个像样的lib你知道有多难么?
就你根据写的这些,我不太相信你的测试程序质量。
Lock-free任意线程堵了都有别的线程make progress,无所谓主次。 |
|
z****e 发帖数: 54598 | 14 因为所有的辅线程都是单向的嘛
一个req塞入整个thread的周期就结束了
以后有req来,就重新建一个thread
你是不是要担心new一个object需要的代价?
放心,java在我电脑上测试,一秒可以new大概5w个thread对象
如果是server的话,就更强大了
没有任何理由说辅线程堵在这里
只有一个主线程
只有可能主辅线程之间争抢lock
要么主等辅,要么辅等主
而无论主辅都不会占用lock,必然释放lock
辅线程因为跟req绑定,所以只负责将command放到map上,就不管了
所以是单向的,致于客户端的output,那是主线程发送的req到客户端上
所以并不是一个thread绑定一个客户端,你的构架有问题,当然会有lock的冲突了 |
|
g*****g 发帖数: 34805 | 15 你丫真是个傻逼,constructor自然有 capacity这个参数,你设 concurrency level想
不设 capacity 都不行。你丫狗屁不懂就知道死撑。作为语言是不假设硬件上限的,
888888看着很多,但要是一个巨牛逼的机器呢?为啥不能有那么多线程。20年后呢?
尼玛前面号称一个线程能锁死所有,现在又来满地打滚,你真够不要脸的 |
|
D***n 发帖数: 6804 | 16 对,这是哪个傻B说一个线程锁住整个Map的,反正到目前为止我就看到你一个。
请别玩弄文字游戏,请别悄悄篡改他人原意,看不懂是某些不看文档的人傻B。
再说了,一个线程不能锁住整个concurrencyhashmap?你再想想?我要给你一个例子,
你是不是承认你是个傻B死全家? |
|
g*****g 发帖数: 34805 | 17 傻逼恼羞成怒了?你干脆说这个ConcurrentHashMap只有一个entry, 所有线程都要更新
这个entry然后拿到锁的线程没响应不就完了。那你还要ConcurrentHashMap干啥?为了
不死全家你就装傻逼程序员是吧? |
|
z****e 发帖数: 54598 | 18 lol
解释这么多
给你一个名词
就是checking嘛
如果你对transaction机制有所了解的话
这个东西早被人做烂了
我还以为是啥高大上的牛逼算法呢
原来就这破烂?
哎哟,你不说我还忘记了
这个逻辑用java一样实现
不用c我一样可以做出来
但是这个性能上的提升十分有限
除了装逼没鸟用,尤其是内存
如果我没记错的话,cassandra等nosql用得比较多
关于这种transaction的判断
有三种我记得,forward checking, backchecking还有一什么叉叉
忘了,一般因为硬盘上这种东西比较容易发生错误
所以主要是persistence时候用,内存不搞这个
内存中的操作以简化线程机制为主,只有分布式存储才会有这种问题
因为无法简化线程和进程之间的冲突,它一定有冲突
原理其实也很简单,就是用一个time stamp来替换lock
当你读的时候,看一下time stamp,然后当你update的时候
另外写一块,完成之后,看原来的time stamp是否被修改过
如果没有,直接用一个原子操作,把ref修改到新的地址块中去
实践中,只有nosql和db等pe... 阅读全帖 |
|
z****e 发帖数: 54598 | 19 如果要用那套扯蛋逻辑
完全弃用concurrenthashmap
直接用copy&write arraylist
每一个thread都往list上add就好了
每次主线程直接读list
制造一个temp list,然后addAll并removeAll
就lock free了,那个list会在读的时候
自动生成一个snapshot,然后把其他thread的add操作
短暂寄存在另外一边,等主线程完成之后,再add回来
这就是lock free了,如果非要这么做的话 |
|
d******e 发帖数: 2265 | 20 说说我的简单的不用锁的对战射击:
1. 所有的对象都改actor,greenlet(python), haskell threads.
2. actor间相互发消息。砍就是砍消息,自己处理自己的状态
3. actor处理完消息把状态delta发给地图线程
4. 地图线程每20ms汇总更新一次,把状态返还用户活着用户的delegate.
特点:完全没锁,现在机器一台host 几百万的actor应该是可以的。对于游戏这种low
latency的饮用,几万肯定可以。
没有基于过于底层的c/C++来实现。 |
|
e***a 发帖数: 1661 | 21 多线程算法 比 刷题网站上的单线程算法 难很多。
想请教 应该看哪几本书? |
|
k**********g 发帖数: 989 | 22
你说你要自修多线程,得有个大概的课程范围。否则的话,还是先涉猎一下,或者展开
说说自己的学习目的。如果是纯粹为找工作的话,也请分享你心目中的工作性质。
这一大堆名词,多线程,多核,计算机集群,分布式(图算法,矩阵算法,学习算法,
数据库算法),在线算法,都有相关但不等价。
要搞清楚自己想学甚麽,对自己的理想工作是否有用。否则对雇主来说你的技能只是对
牛弹琴。 |
|
w***x 发帖数: 105 | 23 个人觉得先学点基本知识,比如pthread的各个api要弄明白,然后看看相关的linux
kernel代码,具体到某个cpu架构下如何实现,然后看cpu spec弄懂具体怎么回事,接
着可以看看lock free的一些实现。到此可以说真正明白了多线程编程是怎么回事。有
了这些基础知识,理解更高阶的算法或者coding实现一些多线程的应用,就会得心应手
了。 |
|
g*****g 发帖数: 34805 | 24 原则就是不要乱开线程,要用 config好的 threadpool, 要让 container管理这样
shutdown server的时候是可控的。spring也是个 container.
虽然不用管理 pool, 还是多线程,有没有问题在于有没有共享资源。比如一个 bean里
有个简单计数器,是一定会出问题的。
container |
|
k**********g 发帖数: 989 | 25
首先所有底层的第三方代码要进行代码审查,看看有没有要修补,要上锁或加倍留意的
地方,例如mutable singleton,thread local data。其中的「锁」会用两种方式确保
正确运作而不锁死∶数据依赖和任务依赖。巩固代码後,下面的工作可分为三方面∶任
务包装,数据包装,界面包装。这包装和encapsulation不同,本质是换汤不换药,不
过是把代码结构稍为修改了。任务包装是把可执行的耗时任务分割为单元,细分为CPU
intensive和IO intensive,再分装为Callable。要确保每一个单元提交到Executor後
,能在任意thread成功执行。数据包装是把数据分类为Write once read many(WORM)或
是mutable。WORM会变成Futures。Mutable按需要可能改写成immutable pattern(类似
copy on modify)或用上述的依赖链使其单线程化。(即使单线程化,不相关的任务仍
可并列执行。)界面包装是把上述的改写用最简洁易用的方式表达,确保接口的组合性
(composability)。
经常会用到 ... 阅读全帖 |
|
T*****e 发帖数: 361 | 26 哈哈,当时用多线程已经是头一次了,很多方面都没考虑到/对,还是走了一些弯路的
。threadpool当时没用好像是因为没有看到线程配对(一个工作一个监测控制)的例子
,自己不知道如何着手。
JMX没有接触过,到现在也只是听说过。看来有空可以看看。
当时考虑过用Message Queue来做调度,不过没找到persistency和recovery方面的资料
(主要是这个也是似懂非懂),后来直接把调度做成数据库的更新与查询了事。
后来学scala的actor,觉得akka的actor就挺好挺简单,不过重写是不可能了。 |
|
z****e 发帖数: 54598 | 27 多线程直接上框架,还写啥呀
没事找事,只有很少情况才会不得不去处理多线程的并发 |
|
z****e 发帖数: 54598 | 28 fp涵盖了var
只是不推荐使用var
否则会在并发的时候用上大量的lock
会让你的程序变得难以维护
这一点上说,无论什么多线程的框架
其本意都是为了让用户不再使用lock
像单线程一样编程是目的
这个其实无论啥都是一样的
但是实现的手段截然不同,而且效果也很明显有差异 |
|
z****e 发帖数: 54598 | 29 你搞错了吧
node才是最大的限制
单线程怎么做都是束手束脚的
vertx的限制是最少的
我没搞砸,两个我都看明白了
所以才会告诉你单线程sucks
而你根本没看懂vert.x在做啥 |
|
z****e 发帖数: 54598 | 30 async还要库?
只要有lambda,什么都可以轻易做到async
为什么要库?
即便没有lambda,reflection也同样可以做到完全的async
话说async完全不完全其实就是看你有没有block thread
只要你能让你的组件不block thread,你就能做到完全的async
而且对于多线程来说,一个最最最简单的做到async的方法
就是对于某些特别耗时的step,额外启动独立的线程就好了
所谓worker只是增加了callback func进去而已
如果不需要callback的话,直接new thread().start(),搞定
这个就是最简单的async |
|
z****e 发帖数: 54598 | 31 多线程直接上框架,还写啥呀
没事找事,只有很少情况才会不得不去处理多线程的并发 |
|
z****e 发帖数: 54598 | 32 fp涵盖了var
只是不推荐使用var
否则会在并发的时候用上大量的lock
会让你的程序变得难以维护
这一点上说,无论什么多线程的框架
其本意都是为了让用户不再使用lock
像单线程一样编程是目的
这个其实无论啥都是一样的
但是实现的手段截然不同,而且效果也很明显有差异 |
|
z****e 发帖数: 54598 | 33 你搞错了吧
node才是最大的限制
单线程怎么做都是束手束脚的
vertx的限制是最少的
我没搞砸,两个我都看明白了
所以才会告诉你单线程sucks
而你根本没看懂vert.x在做啥 |
|
z****e 发帖数: 54598 | 34 async还要库?
只要有lambda,什么都可以轻易做到async
为什么要库?
即便没有lambda,reflection也同样可以做到完全的async
话说async完全不完全其实就是看你有没有block thread
只要你能让你的组件不block thread,你就能做到完全的async
而且对于多线程来说,一个最最最简单的做到async的方法
就是对于某些特别耗时的step,额外启动独立的线程就好了
所谓worker只是增加了callback func进去而已
如果不需要callback的话,直接new thread().start(),搞定
这个就是最简单的async |
|
w***g 发帖数: 5958 | 35 你的出发点是好的,但我觉得没做到点子上。48分钟walltime,就是差1分钟,也就是2
%的样子,并不是显著差异。如果你非要测这2%的差异,那么就要跑比如10次取平均,
而且每次跑之前需要invalidate buffer cache http://aplawrence.com/Linux/buffer_cache.html。有各种原因可能导致2%的差异,不一定光是Xms, Xmx的问题。当然最后测出来,可能还是只有2%的差异。所以还不如花时间在优化代码上,尽量简化代码的内存分配,减少不确定性,提高L2 cache命中率。前面也提了,把Xmx和Xms设成比你可用的最大量小一点就可以,反正不用也是浪费。
thread > core会有性能提升是因为一个thread block的时候另一个thread可以跑。
hyperthread有时候有帮助,有时候反而会使得程序更慢,没有一个定论。我认识有的人
一上来就disable hyperthreading。我的经验是hyperthread能有一定的性能提升。
如果你的cache命中率本来就低,那么再提高线程数可能还能更快。但正道是改代码
... 阅读全帖 |
|
c*********e 发帖数: 16335 | 36 线程数要调的,你先设成一个值,然后看cpu利用率。如果利用率很低,就加几个线程。 |
|
A*******e 发帖数: 2419 | 37 有一个任务,需要大量读HBase,处理后写到磁盘上。处理本身很简单。
现在是两个任务/进程,每个任务四个线程。想增加吞吐量,是应该加线程,还是加进
程? |
|
d*********g 发帖数: 38 | 38 你这一说我也糊涂了,我觉得2似乎也不行。这样一来,两个相同class的线程(比如m1
m2)能共享什么呢?如果是两个不同class的线程呢?(比如m1和n)。 |
|
d*********g 发帖数: 38 | 39 的确是半路出家,刚开始看多线程,一团雾水,感谢楼上几位。
那很多资料都写到“All threads of a process share its virtual address space
and system resources.”或类似的意思,这个share有什么好处呢,既然每个线程都有
自己的私有栈。 |
|
t**********1 发帖数: 550 | 40 发信人: teacherwei01 (TW), 信区: Programming
标 题: Re: goodbug,我的计数器支持不支持transaction?
发信站: BBS 未名空间站 (Tue Dec 8 22:17:20 2015, 美东)
你别不要脸啊。多线程你看不懂。单线程那个,一个个顺序处理请求,要是不支持
transaction的话,是不是你智商有问题?
再问你一次,我的计数器支持不支持transaction?
还有,你的嘴怎么这么脏?厕所么?你看看你这些帖子,哪个不是口吐大粪? |
|
t**********1 发帖数: 550 | 41 你的嘴太脏了。
你说,我的计数器不支持transaction,现在我问你到底支持不支持?
你说别的都没用。你说我几周写出来的,或者几年写出来的,考古贴别人没兴趣听你
bibi。
单线程简单,你给我写一个单线程计数器出票的,就我那个specs,加上简单网络I/O,
协议随你定。能每秒50万就算你赢好不好? |
|
w***g 发帖数: 5958 | 42 老魏的polling线程表示很爽。然后就被GPU上的SIMD线程鄙视了。
投胎绝对是一门学问。
, |
|
p*****y 发帖数: 1049 | 43 上面的第一段代码,锁的是代码,因为任何一个线程到这里就会与其他线程冲突。
整个函数全部被锁住了。 |
|
d***a 发帖数: 13752 | 44 楼主似乎修改了原文?
你这样写代码,相当于把1.txt到100.txt,合起来共用一个锁。一个线程访问1.txt,
另一个线程就不能访问任何一个其它的文件。
如果因为某种原因你要用mutex,那应该用100个mutex,每个文件给一个。 |
|
t**8 发帖数: 4527 | 45 多线程的同步就是防止多线程操作下引起结果不确定
只要能避免结果不确定, 任何办法都是可以
不强调锁什么, 那是具体实现问题 |
|
c****3 发帖数: 10787 | 46 你得先说为啥多线程要同时写一个文件,是多线程下载,还是什么其它应用。
没有实时性要求,当然可以轮询。
有实时性要求,要同时写一个文件,操作文件内部指针,用select,epoll的系统调用
,显然比用mutex去锁这个文件好 |
|
T*****e 发帖数: 361 | 47 如果dc.dosomething()的呼叫线程是MyThread或者它的子类,直接吧当前线程cast成
MyThread就能拿到id了吧。 |
|
w**z 发帖数: 8232 | 48 能说简洁一点吗?
看上去,你这多线程设计不太对,要根据线程id 进行操作?smells like disaster to
me. |
|
b***i 发帖数: 3043 | 49 网上很多说volatile和线程就没有关系。
我现在计划在线程里面
volatile bool quit=false;
void worker(){
while(!quit){
...
}
}
然后在一个UI的按钮那里
quit=true;
这样对不对? |
|
b***i 发帖数: 3043 | 50 好像确实不对了,说的是某些CPU比如Alpha, ARM,和x86是不一样的,volatile自己不
能保证任何事情。完全取决于编译器是否还是按照原来的约定俗成的方案
新的方法是用C++的标准写法,有各种不同级别。
另外,退出线程除了busy wait,好像没有别的办法。即使OS能够在context switch的
时候查询是否要退出线程,但是没法正确的释放所有的资源,因为代码并没有执行完。
所以还得代码自己解决这个问题。 |
|