由买买提看人间百态

topics

全部话题 - 话题: 单线程
1 2 3 4 5 6 7 8 9 10 下页 末页 (共10页)
z****e
发帖数: 54598
1
来自主题: Programming版 - 单线程多线程说到底
就是一个调度问题
一般多线程本质就是交给os去做调度
做成单线程,等于自己去做调度,纯粹吃太饱了撑着
如果只是为了躲开lock的话
压根没有必要,有的是办法
随便一个web server/web service server/app server什么都可以做到
单线程模式,主要是用在游戏上
因为游戏上如果用多线程,随便一个锁出问题
整个屏幕就停滞了,游戏因为动画原因,所以对一些细微的变化
很敏感,所以千万不要搞成多线程,一旦冲突整个游戏就挂了
要搞成伪的多线程,就是单主线程加辅助线程的模式
这就是伪多线程的由来,如果你google一下游戏多线程
就能看到很多这样的例子,教你怎么用单线程来替换多线程
但是对于server来说,其实你没有必要自己去搞
因为一来,你有各种server软件帮你做,你不需要用到各种锁
或者说你不需要自己去倒腾锁
其次就是,不管怎样,多cpu多core是趋势
你自己处理调度,就没事找事
因为os早搞定很多年了,没有必要
比如老魏那种,连cpu多少个core,每个core做什么都要自己调度
我哭了,老魏要是一不小心上班路上出了点啥意外,写的代码别人连接手都无法接手
... 阅读全帖
h*d
发帖数: 214
2
来自主题: Programming版 - 单线程多线程说到底

......
这么说感觉你对多线程编程不熟悉啊。决大部分的GUI API都是单线程的,照你这么说
GUI应用开发也不能用多线程了?用单线程写游戏的一个优势就是容易同步控制所有游
戏元素更新。这个在多线程里可以作到但是需要更多的多线程编写的技能。但无论如何
,GUI的更新绝对是要在一个线程里操作的。这个可能就是你误以为的游戏就是单线程
的。
b*******g
发帖数: 603
3
傻逼你丫还没完了,你丫可是花了几周才写出一个多线程计数器,几分钟内就被我鉴定
是太监的。又花了一个晚上给你们这些外行解释为什么。
至于单线程,很显然 throughout是最大问题,单线程要是能行你这傻逼折腾多线程干
啥,谁不知道单线程简单。你丫也自己知道没戏尿遁了。
现在来折腾单线程能不能做 transaction,你丫屁眼里生了脑子夹到了吧。
z****e
发帖数: 54598
4
来自主题: Programming版 - mobile上才应该用单线程
因为mobile都是一个人在用
而server一般都是多人共用
所以从本质上说,客户端的app就是单线程便可,负责好欺骗用户的眼睛
剩余的core/cpu这些留给background apps
但是server从本质上说因为是多人共用,所以本质上就应该是多线程的
而非单线程,这样设计的结构以及代码实现直观,便于理解
所以swift,vert.x设计都很合理,约束少,private member都可以自由访问
android感觉怪怪的,双线程还是会经常冲突
不得不在controller和model之间用上一堆的原子操作
虽然我不用set/get以及lock这些,但是为此小心翼翼,其实不划算
android搞成单线程就好了,像swift那样就很好用
用swift除了语法有些蛋疼以外,其他写起来真是一种享受
xcode太爽了,android studio次之
w*********s
发帖数: 277
5
【 以下文字转载自 Programming 讨论区 】
发信人: woganmitbbs (我gan买买提), 信区: Programming
标 题: 用多线程怎么比单线程还慢呢?
发信站: BBS 未名空间站 (Sun Nov 14 03:48:38 2010, 美东)
用perl来读一堆文件
1.单线程顺序一个一个的读文件
2.用多线程读多个文件,每个线程读一个文件
光读,没做任何操作。
用time命令看运行时间
结果发现2比1慢好多,咋回事呢?
谢谢!
z****e
发帖数: 54598
6
来自主题: Programming版 - 单线程一般都是历史原因
比如脚本,脚本本身就是简化编程,不需要理解各种乱七八糟的概念
就能上手写的东西,那当然默认就是单线程的,上来就多线程
那还简化什么?
还有一个是gui,因为人眼对刷新频率非常敏感
如果低于一定频率,人眼会明显感觉到差异
所以一定要保证ui线程刷新不被打断
一般多线程的冲突和锁对于ui线程的影响是致命的
所以尽量简化,就不要搞多线程了
即便多线程更接近客观事实
这个主要是在游戏上用得比较多
如果你问游戏里面得多线程
一般下面就会有人回答说,你要控制主线程
然后让主线程loop,然后控制每一次loop消耗时间酱紫
这就是所谓的伪多线程
c*****4
发帖数: 1777
7
来自主题: Programming版 - 单线程多线程说到底
简历上有无多线程,是六位数年薪和五位数年薪的区别。因为会做多线程的人大脑结构
和只会做单线程的不一样。做PERM打广告申请绿卡,只要列明会多线程,一份合格简历
都收不到。
w*********s
发帖数: 277
8
来自主题: Programming版 - 用多线程怎么比单线程还慢呢?
用perl来读一堆文件
1.单线程顺序一个一个的读文件
2.用多线程读多个文件,每个线程读一个文件
光读,没做任何操作。
用time命令看运行时间
结果发现2比1慢好多,咋回事呢?
谢谢!
x****u
发帖数: 44466
9
来自主题: Programming版 - 单线程一般都是历史原因
闪不闪取决于是否用buffer,和单线程多线程无关。
现代的GUI引擎非常类似浏览器,工作线程一大堆。
t**********1
发帖数: 550
10
你的嘴太脏了。
你说,我的计数器不支持transaction,现在我问你到底支持不支持?
你说别的都没用。你说我几周写出来的,或者几年写出来的,考古贴别人没兴趣听你
bibi。
单线程简单,你给我写一个单线程计数器出票的,就我那个specs,加上简单网络I/O,
协议随你定。能每秒50万就算你赢好不好?
z****e
发帖数: 54598
11
来自主题: Programming版 - 单线程的程序怎么搞?
比如r这种单线程的程序,我尝试了一下用多线程并发
结果马上出问题,100个并发就不行了
我现在的想法是,用一个singleton包装后访问,每台服务器放一个r
然后每台的weblogic都用这个singleton访问,加上synchronized关键字
以控制访问次数和并发的数量否则会出问题,有谁搞过java中调用r的经验没?
x****u
发帖数: 44466
12
来自主题: Programming版 - 单线程一般都是历史原因
没说到点子上。现在的GUI都是多线程保证流畅的,但逻辑部分是单线程。
t**********1
发帖数: 550
13
发信人: teacherwei01 (TW), 信区: Programming
标 题: Re: goodbug,我的计数器支持不支持transaction?
发信站: BBS 未名空间站 (Tue Dec 8 22:17:20 2015, 美东)
你别不要脸啊。多线程你看不懂。单线程那个,一个个顺序处理请求,要是不支持
transaction的话,是不是你智商有问题?
再问你一次,我的计数器支持不支持transaction?
还有,你的嘴怎么这么脏?厕所么?你看看你这些帖子,哪个不是口吐大粪?
l****u
发帖数: 4594
14
我自己编写的单线程程序,运行时,为什么两个内核都在工作?
难道多核不是thread-level parallelism,而是instruction-level?
T********i
发帖数: 2416
15
来自主题: Programming版 - 战为止戈,单线程 50M TPS
我说过,我还保留单线程处理订票请求的选项。
今天写了一个小程序进行测试。
假设:
路段有1000万个。也就是全国1000万个车站
当然,全国不可能有1000万个车站。但是可以按照路段/车次划分。
也就是全国几个月的车票可以放进去
每趟车不超过56635个座位,用ushort表达。
内存规划:
一共大约20M数据,全部fit进L3 cache。
假定:
还是一次请求20个路段。
初始化:
1000万路段填满,一共超过320亿张票。不知道够不够今后10年的总运量?
访问模式:
尽量避免L1和L2 cache hit。每个循环每路段逐一访问,最大可能造成L1,L2 miss。
结果:
如下程序:
循环:5000 × 10000000 / 20 = 2500000000
用时:49.86s
2500000000 / 49.86 = 50.14M TPS。
程序如下:
unsigned short data[10000000];
bool reserveTicket(unsigned short *line, int start, int len) {
unsigned short *p = l... 阅读全帖
T********i
发帖数: 2416
16
来自主题: Programming版 - 战为止戈,单线程 50M TPS
那几个全堆程序员还有啥好说?
估计今后100年以内,此类应用单机单线程都将不可被超越。
g*****g
发帖数: 34805
17
来自主题: Programming版 - 战为止戈,单线程 50M TPS
一个破计数器只能做 50m, 加上找座位 5m 必然挂。加上 io 序列化 5万都够呛。mit
没人需要你指导单线程计数器怎么写。晒这个程序太搞笑了。
N*n
发帖数: 456
18
来自主题: Programming版 - 战为止戈,单线程 50M TPS
单机计数器快算什么本事。。
至少应该加两个部分:
1)查询。所有状态都在一个单机装着。其它任务分给其它附属机器,可以。但是,至
少得允许其它机器查询。哪怕是只一个机器查询,备份,也行,但不能没有
2)必须和多个抢票client联网。否则8个NIC放在那里摆设啊。proof of concept的部
分得有。
这两部分有了,算法没问题,管你是单线程还是多线,达到5M/s, 可以算这部分模块的
proof of concept 有了。

mit
t**********1
发帖数: 550
19
我同步的当然可以。现在除了你,还有谁说不可以的?
现在我问你,单线程的计数器,到底支持不支持transaction?你痛快点回答就好了。
bibi些没用的,让人家瞧不起。你看logan这回能瞧得起你么?
z****e
发帖数: 54598
20
会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖
z****e
发帖数: 54598
21
会依次对比node.js, fp, spring, ejb和vert.x的解决方案,然后自己看哪个最好
从最基本的说起,所有语言都一定会有两个东西
一个是变量,我们用var(variable)来表示
另外一个是方法/函数,用func(function)表示
假设有一个函数和一个变量
var var1;
func func1(){
var1 = 0;
return var1+1;//应该是1
}
那现在如果有多个线程并发
那结果会怎样?
那在func1执行完var1 = 0;之后
就有可能有其他线程插入,把var1改成其他值
比如改成var1 = 2; 或者var1 = "goodbug乱入";
那瞬间func1返回值不再是1了,那这个显然是不可接受的
那怎么办?
第一种是fp的做法,fp说,把变量做成immutable
也就是var -> val(value),把var1改成
val1 = 0;
return val1+1;//就一定是1鸟
但是这样为了多线程把所有的参数都搞成immutable鸟
然后你写代码时候,需要时刻提醒自己
常量啊,常量啊,常量啊……
第二种是node.js等... 阅读全帖
r******r
发帖数: 700
22
来自主题: Java版 - 多线程真头疼,但也挺有趣
有点点长啊。
有一个 tool, 以前处理的数据比较少,所以速度,时间都不成问题。但现在需要处理
的数据增大,速度问题就突出了。费了好大一番力气,总算弄通了,一次处理的时间由
原来的 24 个小时,减小为 3 个小时。
第一次弄多线程,很费劲。但弄通了(只是这个小 task 弄通了,并非多线程弄通了)
,又觉得很有意思,小有成就感。分享一下,希望对 beginner 有帮助,也希望有经验
的多指教。其中有些地方,还没有完全明白,正在学习-ing。
程序其实也简单,就是在单机上运行的一个程序。过去单线程的,即使在多 core 的机
器上运行,也只能利用处理器的少部分能力。现在就是要改为多线程,多核处理。
数据存在 10 个文本文件中,每个大约 40M.程序从每个文件逐行读取,逐行处理,很
多信息被保存到不同的数据结构中。最后输出处理报告,中间还要将部分处理信息输出
到一个 XML 文件中。
经过一番 google search 和研究,所做的改动包括:
1) 将原来的逐行读取,逐行处理,改为先将每个文件的所有行读到一个新建的
DataStore 中,这个结构比较简单。就是保持原来的每行文... 阅读全帖
z*******3
发帖数: 13709
23
来自主题: Java版 - 多线程真头疼,但也挺有趣
多线程最好要割离各个资源之间的联系
对于互相依赖的部分,其实很难用多线程来优化
而且会因为资源之间的协调而导致冲突
造成额外的浪费,还不如用单线程
常见的就是游戏客户端,其实大部分游戏界面都是伪多线程
其本质就是一个单线程程序
现在连web也在逐步变成单线程的
当然还是有多线程,但是并不是完全意义上的多线程
而是主线程+分支线程,类似swing那种模式
对于特别消耗时间的任务,才新起线程去做
其他的,主线程搞定
真正的多线程现在仅仅在企业系统集成的后端才会看到
前端交给单线程去搞定
h**********c
发帖数: 4120
24
问题是这样的.
我的机器是vista 32,q 6600 单CPU
大概有两亿个左右的任务,互相独立,其实都是简单的数学运算.
我首先用最普通的c++ 写了个单线程程序,跑了大概994.77100秒.
然后照着一个msdn上的例题,改为3个线程,跑了1729.13400秒;
6个线程,1756.93700秒.
问题:
1.怎么解释这一现象,多线程反倒慢了?
2.程序贴在楼下,请高人帮分析分析,如何优化,还是vista对这种问题已经优化,多线程
是没有必要的?
3.如果是多个cpu的话,多线程程序能否就会比单线程快?
有没有什么软件能模拟多个cpu环境?
搞科学计算没办法.多个cpu的机器太贵.
谢谢!
d*e
发帖数: 109
25
来自主题: Programming版 - 【求助】Fortran多线程执行效率问题
【 以下文字转载自 CS 讨论区 】
发信人: die (Die), 信区: CS
标 题: 【求助】Fortran多线程执行效率问题
发信站: BBS 未名空间站 (Tue Aug 11 08:55:06 2009, 美东)
请教为何多线程执行起来花费时间比单线程要多呢?
非常感谢~
问题如下:
函数是用MONT CARLO方法计算圆周率。单线程计算函数两次共耗费大约是97;而两个线
程分别计算函数一次耗费的时间是392.
环境:
CPU: i7920 4核
操作系统:Windows Vista
编译器:Fortran 90
程序如下:
多线程主程序:
Program TESTPROC0
use ifqwin
use dfmt
use threadfunction
implicit none
integer,parameter::n_thread=2,n_c=2
integer(INT_PTR_KIND())::Threads_Handle(n_thread),waitresult,cend,retlog,
retint,&
thread_
z****e
发帖数: 2024
26
来自主题: Programming版 - 多线程有什么优化的方法?
分别用-O0,-O1,-O2,-O3,都没有太大效果。
最多有个10%的变化。还是单线程那个快不少。
另外,那个分号加上去了,不影响结果。
-O3下的结果:
3.22 seconds,双线程
2.41 seconds,单线程。
我是明明看见双线程时候,两个cpu100%,然后一个还维持在100%,另一个掉下来。对,我就同步了一次,在双线程的时候。
w***g
发帖数: 5958
27
如果有I/O的话,那么一个线程block了另一个还可以运行,所以多线程仍然会比单线程
快。
hyperthread技术就是基于这个原理,只不过它是用硬件在单CPU上实现的多线程(对
CPU来说,I/O也包括memory access)。
这个问题跟workload很有关系,需要具体分析。
d*e
发帖数: 109
28
请教为何多线程执行起来花费时间比单线程要多呢?
非常感谢~
问题如下:
函数是用MONT CARLO方法计算圆周率。单线程计算函数两次共耗费大约是97;而两个线
程分别计算函数一次耗费的时间是392.
环境:
CPU: i7920 4核
操作系统:Windows Vista
编译器:Fortran 90
程序如下:
多线程主程序:
Program TESTPROC0
use ifqwin
use dfmt
use threadfunction
implicit none
integer,parameter::n_thread=2,n_c=2
integer(INT_PTR_KIND())::Threads_Handle(n_thread),waitresult,cend,retlog,
retint,&
thread_handle_1,thread_handle_2
integer(INT_PTR_KIND()), PARAMETER :: security = 0
integer(INT_PTR_KIND()), PARAMETE
c*m
发帖数: 836
29
来自主题: Java版 - 多线程真头疼,但也挺有趣
我以为他是in general的说多线程。绝大多数DataSource是thread safe的,所以对DS
的操作完全不需要synchronized。不过,即使是最极端的情况,每次只允许一个thread
access DataSource,也还是会快。因为他的程序是个IO和CPU交互或者同时进行的过
程,在这种情况下,单线程只能做一会CPU,做一会IO。如果用多线程,即使IO和计算
本身全是单线程,至少IO和CPU可以同时进行了。更不要说IO和CPU本身也都可以用多线
程优化了。
x****u
发帖数: 44466
30
我搜了C标准,找不到什么对线程模型的描述。所以这种优化如果对多线程产生问题,
多半是违反C语法。
C++的abstract machine有没有规定必须是单线程的?
咱们讨论的是编译器的行为。我认为gcc很可能根本就不按照你的想法运行,所以most
likely根本就没有bug。
Wikipedia里面的条目也只是含糊的说,优化的前提是编译器发现no other code can
possibly change the value,这里面也没说前提是单线程。

abstr
abstract
re
and
+
j
z****e
发帖数: 54598
31
另外,只有node才需要ipc
其它框架都是itc
这就是为啥node很傻逼
像单线程一样编程是目的
但是你真把所有东西都做成单线程的话
那个thread挂了咋办捏?
哪怕是一个不小心,被阿三程序员写段代码blocked了
你不一样很苦逼?
当然这个问题哪怕是弄成itc一样存在
但是至少至少,其它启动的threads会在一定程度上抵消这个问题
我猜测这就是为啥在大多数报告里面,node总是会有丢包的问题
可能就是那个线程出了问题,把所有鸡蛋全部放在一个篮子里
自然会出问题,vert.x说,我按照cpu有多少个core来建threads
一个dual core的cpu,vert.x就启两个threads,如果是两个这种cpus
就起2*2=4个threads,这样万一其中一个thread被blocked,一样不会挂,对不对?
当然blocked在异步编程中是错误的,而且同一个process下处理communication
比起多个processes下处理,那是要强太多了,不同process之间做c,那很苦逼的好不好
得调用第三方工具,各种狗血问题,所以你还是用node的思维来看其他多线程... 阅读全帖
z****e
发帖数: 54598
32
另外,只有node才需要ipc
其它框架都是itc
这就是为啥node很傻逼
像单线程一样编程是目的
但是你真把所有东西都做成单线程的话
那个thread挂了咋办捏?
哪怕是一个不小心,被阿三程序员写段代码blocked了
你不一样很苦逼?
当然这个问题哪怕是弄成itc一样存在
但是至少至少,其它启动的threads会在一定程度上抵消这个问题
我猜测这就是为啥在大多数报告里面,node总是会有丢包的问题
可能就是那个线程出了问题,把所有鸡蛋全部放在一个篮子里
自然会出问题,vert.x说,我按照cpu有多少个core来建threads
一个dual core的cpu,vert.x就启两个threads,如果是两个这种cpus
就起2*2=4个threads,这样万一其中一个thread被blocked,一样不会挂,对不对?
当然blocked在异步编程中是错误的,而且同一个process下处理communication
比起多个processes下处理,那是要强太多了,不同process之间做c,那很苦逼的好不好
得调用第三方工具,各种狗血问题,所以你还是用node的思维来看其他多线程... 阅读全帖
z*******3
发帖数: 13709
33
来自主题: Java版 - 多线程真头疼,但也挺有趣
呼呼,你楼上一凶
猴屁股都被你吓走了
我觉得他说不会快的理由大概跟你这个看到的一致
也就是在datasource的时候,楼主用了同步
所以所有线程不得不排队读取
而且貌似楼主对于输出也做了同步,而且要依次输出
所以输入和输出同时被掐住,都需要排队的前提下
那么除非中间处理时间很长,否则是不会快的
因为这样的话,单线程跟多线程其实木有太大区别
反正输入和输出都要排队,中间的多线程如果在单核机器上的话
其实也是伪的多线程,所以不会快
所以多线程最主要的是隔离线程之间的通信
通信越少多线程越有优势
这也是spring这个框架的理论基础
所有的组件都推荐是无状态的
所有变量跟线程本身绑定,变成thread local
然后这样就可以尽最大可能提高效率

non
z****e
发帖数: 54598
34
来自主题: Programming版 - 用python写多线程。刘姥姥都笑了
所有脚本的多线程都是最弱的一块
可能也就是perl会好一点
不过现在多线程部分
主要是swift和scala在做咯
java提供了几个常用的pkg
但是无论server side还是client side
自己去动手搞多线程的次数也很少
server side有现成的框架,akka,vert.x,都可以直接用
client side的app,那用伪多线程就好了,反正只要伺候好一个ui线程
android我只弄双线程,一个输入线程,另外一个是主循环
ios直接用cocoa了,所以还不知道后面是几个线程
javafx用单线程足够,90fps完全可以搞定
g*****g
发帖数: 34805
35
来自主题: Programming版 - 多线程编程前景如何?
不需要多线程的程序永远不需要多线程来实现,
绝大部分个人软件都不需要多线程。需要多线程
的是网络程序,科学计算程序,服务器
程序。
所以个人软件上多线程恐怕永远不会成为主流,单线程
已经实时了,你多线程干啥呢?
至于服务器上,多线程已经主流了吧。至少俺们做企业应用
的java程序员是这样。
z****e
发帖数: 54598
36
来自主题: Programming版 - 单线程一般都是历史原因
nonblock主要是为了不打断主线程
但是有些时候有些任务又会占用线程太长时间
所以如果不让主线程继续刷新的话
整个画面就停滞了,所以必需先放开主线程
也就是ui线程,然后分配时间片给另外启动的那个线程
等另外那个线程执行结束之后,再让主线程callback那个结果
酱紫
话说做图形学的话,这些应该是常见的问题
不明白几个做图形的为什么不结合实际例子回答这种问题
x*****0
发帖数: 452
37
Assume in a system, users will register a callback function with system and
that callback function will be called when an event is triggered
but if the event is already triggered, the user will synchronously call
the callback function
For example
suppose user i registers cb i at time Ti,
and the event happens at time Te
and assume that T1 < T2 < T3 <...< Tm < Te < Tm+1 < ... < Tn
at time Te, cb1..cbm will be called
cbm+1 .. cbn will be called synchronously
impleme... 阅读全帖
h**********c
发帖数: 4120
38
在科学计算中,符合某些特征的sparse matrices,可以分块进行多路处理,
这个在linux下,多cpu的performance提高相当大的,(老板有一个东西,他的博后用
fortran写的mpi).
linux 多核,也提高很大,我观察过,在linux下,单线程只有一个核在跑,老板的的东西运
行时,四个核都在跑.(梢后我会把上面的程序在linux上再试验试验).
这样的程序我没写过,想试验一下,大体的思路就是让独立的运算让每个核承担一部分,
for vista我观察system monitor,单线程的时候,四个核都在跑,但每个都不满,多线程
的时候,四个核也都在跑,而且跑满了,那么说明,vista只是简单把运算平均分给各个核,
但多核用来context switch(thread 不知道是不是context switch)的开销thread越多
越大.
看来最初想法和具体的架构有相当的出入.
z*******3
发帖数: 13709
39
那个评级有些扯淡,毕竟不是所有人都是写网站的
而且大多数web上的应用其实一点不比网站的负载低
还有swing是单线程的,你放多线程时候要小心并发冲突
javafx也是单线程的
r**********g
发帖数: 22734
40
来自主题: JobHunting版 - 菜鸟请教多线程怎么学
找个现成的单线程程序改,尽力优化。记得有谁说过学multi-thread五个阶段:第一阶
段发现多线程好用,于是到处都用;第二阶段发现需要lock,到处都synchronize;第
三阶段发现会死锁,会正确用lock;第四阶段进一步减少lock来加快速度;最高境界要
分析到cache,如何分配共享内存以减少隐蔽的false sharing。
要想写得非常好,有很长的路要走,比如多线程读数据,尽可能把数据放在一个内存
block,能够fit进cache line,这样读数据速度快;多线程写数据,则正好相反,最好
每个线程写自己的block,尽量分开不在同一个cache line。即使不是多线程写同一个
address,写同一个block也会造成隐含的false sharing lock,效率低很多。
z*******3
发帖数: 13709
41
来自主题: Java版 - 多线程真头疼,但也挺有趣
还有工作流engine和web service这些,也都是多线程搞的
包括ui都有自己的多线程,比如swing的invokelater
javafx的task&service
有jvm的地方就有多线程
包括所谓的单线程,异步和event,其实底层都用到了多线程
但就是说没有必要自己去搞这些底层的多线程api
就算写出来了,后面的人看起来很痛苦
看源代码永远都是很痛苦的一件事
不仅写得好得很少,可读性差,大部分代码写得乱七八糟
而且文档通常也不存在,也不能借用其它公司的工作经验
可维护性变得很差,成本就高了
不过楼主的剧本适用java.util.concurrent
h**********c
发帖数: 4120
42
贴的code,行首的空格和tab都被吃了回扣了,
不过visual studio下把code, CTRL-K,CTRL-F很容易就从新FORMAT
根据liuhulan 同志介绍的MSDN上, KEN KERR的文章,
对单线程做了一些改动,主要还是基于LOCALITY的思想:
1. 不在SUBROUTINE 中使用NEW, DELETE,能不用DYNAMIC MEMALLOC尽量不用,坚决不要
在循环体中使用.
基于这一点,原来单线程900秒,提高到300秒!!
2. 所有SUBROUTINE 改成INLINE,300->287秒.
3. 在循环体内不进行console print,影响不大.
因为我把程序改成把要输出的结果存到一个array,并且要一个counter,因此会有race
condition,需要cs or mutex. multithreading 测试待续.
c*m
发帖数: 1114
43
这个很奇怪,intel网站上也是这个说法,基本就是在multi-thread application情况下
能充分利用cpu能力。不过没有提single-thread的application情况。
如果对单线程程序也一样,那HT对于所有单线程的application 处理能力都下降一半?
这个感觉好不合理。
z****e
发帖数: 54598
44
来自主题: Programming版 - 单线程多线程说到底
我问的是你的设计里面,会不会因为线程调度而打断
你都没听明白我在问什么
要给你举例吗?
java里面有一个AtomicInteger,我就想知道一下
你这里面是不是做了类似的操作
如果你用的不是AtomicInteger,而是Integer的话
这里面会有调度而产生的一些很trivial的问题
当然int不会有问题,你想过你如何给别人解释这里面的问题了么?
难怪你到现在还在单打独斗
nasdaq平台跟你p关系没有
别吹了,你只是一个送单的
k**********g
发帖数: 989
45

首先所有底层的第三方代码要进行代码审查,看看有没有要修补,要上锁或加倍留意的
地方,例如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)。
经常会用到 ... 阅读全帖
z****e
发帖数: 54598
46
你搞错了吧
node才是最大的限制
单线程怎么做都是束手束脚的
vertx的限制是最少的
我没搞砸,两个我都看明白了
所以才会告诉你单线程sucks
而你根本没看懂vert.x在做啥
z****e
发帖数: 54598
47
你搞错了吧
node才是最大的限制
单线程怎么做都是束手束脚的
vertx的限制是最少的
我没搞砸,两个我都看明白了
所以才会告诉你单线程sucks
而你根本没看懂vert.x在做啥
z***e
发帖数: 5393
48
奇怪,不晓得你们都从哪里看到说windows没对多核做优化,凭空YY?有空多看看
windows internal之类的书去。以为还是win98年代啊?
回到lz的问题,如果你的任务分配得当,multi-threading在quad core上面肯定会快些
,你可以从这几个方面测试:
1. 把你那复杂的矩阵运算换成简单容易测试的,比如算10k个数相乘之类的,然后看多
线程和单线程的比较,这个主要是先让你把程序框架弄对,然后再把你自己的什么算法
换进去。
2. 把线程中的输出都关掉,还有StringCchprintf那个---不要在多现程的thread当中
搞.
3. 还不确信,用setaffinity把线程跟单个CPU绑定,如果quad core的每个CPU算1000
个数还不如一个cpu算4000个数来得快,你可以给intel或者ms file bug了。
x****u
发帖数: 44466
49
有几个核就开N的倍数的线程,你的科学计算保持线程数等于核的数量就行。
不过在假多核上,可能出现多线程慢于单线程的问题,这个不是你的错。
h**********c
发帖数: 4120
50
这个六角幻方给人的第一直觉-- 象有限元的网格,
而且的确有限,19!很大,但毕竟有限,但是最后下决心做试一下,还是serawang的几个贴
子(在数学版)比较有启迪的意义.
这个题可以列十五个线性方程,19个未知数,按线性代数的知识,有无穷多解,但是是有代
数表达的.考虑未知数不同,且为1~19.当时没有google,还不知道能不能找到答案,只想
试一下线性代数的知识.
后来用matlab分析发现,十五个线性方程,有十二个是非线性相关,遗憾的是,按matlab例
题,无法给出正确的代数表达式,而且计算的reduced echlon matrix也是错误的.最后花
了两个小时,手工算出来十二个线性方程,那么,知道七个未知数,其他十二个未知数可
得.
matlab是一种科普工具,最后写code还得c/c++.先写了单线程,1700秒居然得出答案!后来照
msdn的多线程又写了一个多线程版本,没有提高,反而更慢.大概是liuhulan转了ken kerr 关于locality的文章,茅
涩顿开.
中间又去干了别的事情,没来得及对windows多线程更多优化,跑到300秒.
在我自己机器上,
1 2 3 4 5 6 7 8 9 10 下页 末页 (共10页)