由买买提看人间百态

topics

全部话题 - 话题: 多线程
首页 上页 1 2 3 4 5 6 7 8 9 10 下页 末页 (共10页)
s****y
发帖数: 503
1
理论上,比如8核CPU可以同时运行8个thread,但是一般运行多少线程比较合适呢?
我觉得应该大于8个,因为可能有线程空闲,但是太多的线程会有很大的switching
overhead和占有太多内存。根据大家的经验,线程数应该怎么确定?
d*********g
发帖数: 38
2
来自主题: Programming版 - 线程共享变量问题,搞不懂。
最近看java多线程郁闷了,理解不了线程之间共享进程地址空间。
举个栗子:
class M extends Thread{
int mValue=0;
public void run(){...}
}
class N extends Thread{
int nValue=1;
public void run{...}
}
class Main{
int mainValue=2;
public static void main(){
Thread m1=new M();
Thread m2=new M();
Thread n=new N();
}
}
这个例子中,Main是主进程吗?可以被m1, m2, n共享的进程空间包括什么?
我的理解有几种可能:
1. m1和m2可以共享mValue ,虽然mValue不是static的。不过我不确定这种共享是否基
于同一进程地址空间。
2. m1, m2, 和 n1可以共享mainValue (因为Main是线程,m1, m2, n1都是该线程... 阅读全帖
k*****u
发帖数: 136
3
来自主题: Programming版 - 线程共享变量问题,搞不懂。
我才楼主是半路出家吧
建议楼主搞清楚几个概念,进程 线程 堆 栈
什么变量存在堆中,什么变量存在栈中
为什么线程之间不能互相共享(存储在各自线程的private栈里)
为什么进程里面的变量可以被线程访问(存储在主进程的共享栈里)
所以1 是不行的,每一个实例化的m都各自含有一个mvalue 彼此独立
2你自己查查吧 写个程序就知道了
w***g
发帖数: 5958
4
来自主题: Programming版 - 我是一个线程 (转载)
std::thread对实现没有明确要求,理论上说可以是用户态线程也可以是操统线程。
可以是preemptive也可以是cooperative。比如说把std::thread移植回windows 3.1,
就会出现cooperative的操统线程。C++的yield是为了支持cooperative thread,
跟coroutine没有直接的关系。
coroutine是语言概念,基本上相当于(python的)"yield"关键字。thread是操作系统概
念,
基本上就是share memory space的process。虽然对于没有yield关键字的语言,
可以用类似cooperative user-space thread的方式实现。但是在编程模型上
的用法是有区别的。一个例子就是thread A上面跑了coroutine A1和A2,
thread B上跑了coroutine B1和B2。其中A1和B2在某一步用mutex进行了同步。
那么这个mutex同步的是线程A和B。Coroutine本身是没有同步概念的。

thread
b***i
发帖数: 3043
5
来自主题: Programming版 - 用volatile退出线程对不对?(C++)
我觉得cache的问题和memory barrier不是同一个问题。所以我一直认为reordering在
这里不会产生任何问题。
你想啊,我让线程退出,我还能有什么有用的信息告诉线程呢?会有什么错误呢?线程
都要退出了,做什么都不重要了。并不是我要传递几个参数,然后改写一个bool的变量
,然后希望线程读入那几个变量。这里除了quit没有任何其他变量的读写
F****n
发帖数: 3271
6
来自主题: Programming版 - 用volatile退出线程对不对?(C++)
cache access 和 memory barrier 从reorder 优化的角度是一个道理
为什么recorder优化可行?是因为compiler发现你程序某些部分并不互相关联
所以把顺序换换也没关系。但在并行计算的情况下compiler很难通过语义分析(对C/C+
+来说)确定关联性,所以需要额外的memory barrier,它的一个作用就是把一定的顺
序强加在使用不同cache但访问同样内存地址区的并行进程。
为什么决大多数情况下用volatile退出线程不对? 简单的说,因为有数据一致性
要求时volatile不工作,没有数据一致性要求时,你根本不需要volatile。大多数情况
下你总不可能什么都不做就直接quit吧?总要对一些数据进行操作和判断然后决定是否
quit。举个不太恰当的例子:
Connection conn; // assumed to be a db connection;
bool volatile quit;
...
while (!quit) {
conn.doSomething(); // error if conn is closed
... 阅读全帖
P***y
发帖数: 2885
7
我只是有个概念而已。做来这么多年的编程,多线程很常见。但一般用不着自己来写多
线程的框架结构。框架都是别人写好现成的。
要在多线程上面过关,有什么样的衡量标准?
Thanks
j*****u
发帖数: 1133
8
因为多线程同时读,文件在同一块物理硬盘上,磁头要来回切换磁道
文件读取受限于硬盘,多线程不会提高速度
A*******e
发帖数: 2419
9
【 以下文字转载自 Programming 讨论区 】
发信人: AlphaCode (Alpha), 信区: Programming
标 题: 大量读HBase的任务该加线程还是进程?
发信站: BBS 未名空间站 (Tue Jul 28 23:02:18 2015, 美东)
有一个任务,需要大量读HBase,处理后写到磁盘上。处理本身很简单。
现在是两个任务/进程,每个任务四个线程。想增加吞吐量,是应该加线程,还是加进
程?
k***g
发帖数: 166
10
来自主题: JobHunting版 - 一个多线程的简单问题
一大堆数,要按照第一位拷贝到不同的int array里面,比如:
[37, 57, 653, 12, 52, 501, 91, ...]
->
Bucket 1: [12]
Bucket 3: [37]
Bucket 5: [57, 52, 501]
Bucket 6: [653]
Bucket 9: [91]
考虑用多线程来提高效率
想了两个办法:
1. 把数组分成8等份,用8个线程同时做。问题是写入buckets的时候会引发大量锁操作
2. 用9个线程,各自负责一个bucket,看起来貌似就不需要锁了,不知道是否够快
还有更好的办法吗?
r****7
发帖数: 111
11
来自主题: JobHunting版 - 如何两个线程同时写一个文件
今天面试碰到的题目,小白不懂多线程,只会java synchronized加锁。
但是面试官希望我能利用线程间的通信,实现两个多个线程同时写一个文件。
求教。
D***0
发帖数: 138
12
来自主题: JobHunting版 - java多线程问题请教 (转载)
如果两个线程都访问同一组key(int和type的组合),这事一个先进来,看cache里没有,
就要去别的地方去拿,第二个线程这时expected是希望等着第一个线程把value算好了
,可以直接从cache里取,要不它也会同样
的去取这个key对应的value。
l********e
发帖数: 103
13
来自主题: JobHunting版 - 请教大侠们hash table 多线程问题
面试时候
被问到 写个 多线程的hash table
hash table我用linked list解决collision 问题
加lock的时候 我说 要用read write lock
hash table insert 时候用write lock
get的时候用read lock
然后 面试官跟我说
get的时候 不用加任何lock
大不了 get的值是旧的
(我当时 没说话 心想 只要 让我过 你说什么都好)
不过 我不明白为什么get不用加任何lock
如果 一个现在正在更改 一个值 改着一半的时候
正好另一个线程过来读 这时候 岂不是 读出来的值 一般旧一半新
请问各位大侠 我哪里对多线程理解错了?
请指点
谢谢
h**********c
发帖数: 4120
14
在科学计算中,符合某些特征的sparse matrices,可以分块进行多路处理,
这个在linux下,多cpu的performance提高相当大的,(老板有一个东西,他的博后用
fortran写的mpi).
linux 多核,也提高很大,我观察过,在linux下,单线程只有一个核在跑,老板的的东西运
行时,四个核都在跑.(梢后我会把上面的程序在linux上再试验试验).
这样的程序我没写过,想试验一下,大体的思路就是让独立的运算让每个核承担一部分,
for vista我观察system monitor,单线程的时候,四个核都在跑,但每个都不满,多线程
的时候,四个核也都在跑,而且跑满了,那么说明,vista只是简单把运算平均分给各个核,
但多核用来context switch(thread 不知道是不是context switch)的开销thread越多
越大.
看来最初想法和具体的架构有相当的出入.
t****g
发帖数: 35582
15
HT的优势在于当并发线程数量大于核的数量但是单个线程的运算量又不足以占满整个核
的运算能力的时候有用。相当于虚拟的把一个核掰成两个用。

线程
t****g
发帖数: 35582
16
来自主题: Hardware版 - i7的多线程能力还是不错的
很正常,都不是一起完的。C2Q如果开8个线程,其中四个能比另外四个快很多完成,但
是最终完成反而比四线程还慢一点。
i7开8个线程则基本上同时完成,说明HT还是相当给力的。
j****t
发帖数: 29
17
各位前辈好,想请问一下关于Intel Xeon X5687,网上都说是4核8线程:
http://ark.intel.com/products/52578/Intel-Xeon-Processor-X5687-
为什么我的电脑显示的是4核4线程?在任务管理器里面CPU只有4格。如果是8线程的是
不是应该有8格啊?
谢谢啊!
d********r
发帖数: 199
18
请教一个多线程lock机制的问题
我有这样的一个method:
public void methodA(int i) {
Integer key = new Integer(i);

synchronized (key) {
.......... (codeXXX)
}
}
methodA将会被多线程调用。
但codeXXX部分的代码,我要求是对整数i这个参数synchronized的,
即:任何时间内,对同一个参数i,不可以同时执行代码段: codeXXX,
但对不同的整数i,则可以多线程同时执行。
请问我这样实现对不对?
如果不对,该如何实现?
多谢。
d****g
发帖数: 1049
19
比如说我有两个线程
在线程一里面移动指针到纪录99
那在线程二里面读出的纪录是不是也是第99个记录?
c*****t
发帖数: 1879
20
如果你的文件很大,同时处理的时间很长。双线程其实是个不错的选择。
一个专门读硬盘(producer),一个专门处理(consumer)。即使只有
一个 cpu,也是很好的选择。
一般的
while ( read ( buffer ) )
{ dealwith ( buffer ); }
有个很大的问题就是,没有利用 I/O block 的时候(其实 cpu idle)
做事情。不过一般文件小,又因为 disk cache,效果不是太明显。大
文件就比较重要了。

一个,单线程和多线程能达到的速度已经被瓶颈了。
b***i
发帖数: 3043
21
来自主题: Java版 - Java线程一问
有个办法,我增加一个变量叫mustend,
如果我不幸多按了一次开始按钮,则要先让这个线程的mustend=true,然后再生成新的
线程。线程的程序里面,要循环判断mustend, 如果true,就退出。这样行吧。
y***m
发帖数: 7027
22
来自主题: Java版 - 请问线程组要注意什么
比如:
application创建 A,B,C...个线程,每个线程又单独创建一组子线程
A(a,b,c....)
B(a,b,c....)
C(a,b,c....)
thx!
z*******3
发帖数: 13709
23
那个评级有些扯淡,毕竟不是所有人都是写网站的
而且大多数web上的应用其实一点不比网站的负载低
还有swing是单线程的,你放多线程时候要小心并发冲突
javafx也是单线程的
r******r
发帖数: 700
24
这种观点呢?别人的
“我一直认为java.util里那些所谓线程安全的集合对象都是垃圾。基于单个方法的同
步在实际应用中基本上不起什么作用,其负面作用是很多人以为直接用这些对象就能保
证线程安全。
想楼主的代码中提到的场景经常出现,要保证线程安全就必需自己用synchronized把整
个代码片段包起来。”
意思是说,不保护单个方法,在用户建立了一个 Vector v 对象后,对整个 v 保护。
synchronized(v){
}
我觉得这两种方法好像还是有性能上的区别,但是保护对象是最安全,最简单,最直观
的。如果自己设计一个类,选择哪种方式较好?
r******r
发帖数: 700
25
请教两个基本问题;
1. 如果程序要在多线程中运行,是不是在写每个类的时候,都要考虑多线程保护?
Immutable 的除外。因为看了公司的很多代码,都只有零星的保护。很多都完全没有,
但它们并非都是 immutable.
或者换个问题,怎么判断一个系统中的很多类,哪些需要保护,而哪些不需要保护?
2. 如果不考虑效率,是不是对每个涉及到成员变量修改的方法,包括 getter 和
setter,都使用 synchronized,就可以确保线程安全了。如果这样,好像大都类都需
要保护?
z*******3
发帖数: 13709
26
synchronized用在多个线程之间共享对象
但是实际工作中,这种情况都会被尽量避开
现在机器很强大了,也不用太过于担心一些对象的使用问题
就是说如果不同线程之间的对象需要交流的话
要注意override hashcode()来判断不同线程使用的对象是否指代同一个东西
写core java的程序员没有那么多
因为j2ee有大量的工具帮忙做事,开源的收费的都有
一般情况下,不用rebuild wheels
直接拿来用就好了,应该说每一个具体的应用,大部分都是j2ee的范畴
j2ee就是用来做这事的
google不一样,google后台系统的核心是他们自己写的一个东西
写出来的时候就用c++写的,所以再扩展的时候,就不得不上core java去实现
google也有钱和时间让人这么倒腾,其它公司则多数做不到
平均而言core java程序员工资比j2ee的要高
因为j2ee里面有很多初入行的会拉低平均值
大多数人做java起步应该都是从做j2ee开始,而且很大一部分是从做web开始
r******r
发帖数: 700
27
猪头,你的概念有误。
做 synchronized 是为什么? 不就是为了协调多个线程对共享资源访问的一种方式吗
?而多线程对共享资源的访问,不就是 concurrent access 吗?
我的理解是,java.util.concurrent 包讲各种处理多线程的方式和典型的数据结构,
比如 ConcurrentHashMap 放在一起,方便用户使用,但这个库中并不排斥
synchronized 的方式,而且还肯定用到了 synchronized.
l*****o
发帖数: 473
28
来自主题: Java版 - 多线程真头疼,但也挺有趣
我的一些看法:

有问题。
听楼主描述的现象是发生了page Thrashing.
IO bound的情况下,用多线程是非常有好处的。
在单CPU情况下,只有完全CPU bound的情况下,多线程是不利的。而且,多线程还可能
会引起false sharing,锁的开销等wanting。
c*m
发帖数: 836
29
来自主题: Java版 - 多线程真头疼,但也挺有趣
理论上,是会快的,因为
第一,楼主有多核CPU,文本in memory processing is a CPU bound process,所以多
线程处理可以加快
第二,整个程序有IO heavy和CPU heavy的两个部分,即使没有多核CPU,多线程处理也
可以减少block的时间,增加单位时间的throughput。
但是在实践中,400M的data,用现在最普通的家用PC,无论你怎么处理,都是一转眼的
事,多不多线程可能也就是几秒钟的区别。楼主这3小时的processing time实在让人很
纳闷究竟他的程序都干了啥。就算不用buffered reader, 每次读入一个char也用不了
这么久。我现在深度怀疑他没设Xmx参数,造成JVM用的default value (128 or 256M?)
。但是即使这样也不该用三个小时。
n******1
发帖数: 3756
30
来自主题: Java版 - 请教一个多线程的问题
自己练习写了一个多线程读一个字符串,但是没法退出,想请教两个问题
1.这种写法是我自己想出来,有没有更优雅一点的方法呢
2.线程间应该怎么通知结束信号然后退出的?
感觉多线程难用的原因因为需要全部理解才能用好,一个地方没理解好,就用不好
import java.util.Scanner;
import java.util.concurrent.atomic.AtomicInteger;
class Reader implements Runnable {
private int id;
private String[] queue;
private Object lock;
private volatile AtomicInteger index;
private int threads;
private volatile boolean done = false;
public Reader(int id, String[] queue, Object lock, AtomicInteger index,
... 阅读全帖
p*****2
发帖数: 21240
31

legacy code吗?现在新的代码很少用java的多线程了。因为多线程编程太难了。很多
大牛都不敢保证出bug。就跟以前C指针是的,有了GC,没人愿意回去了。现在多线程那
么多framework,没必要往回走,除非performance上有特殊要求。就跟high
performance的现在还用C/C++一样。但是会越来越少了。
d****i
发帖数: 4809
32
记得以前好像是Java的多线程是完全独立于OS的线程的,现在的Java的多线程的实现实
际上底层调用的就是OS native thread,所以应该是OS thread的一层wrapper。
l******y
发帖数: 182
33
有这样一个问题:
// 一个数数类。其中,minus只有在count >= 10的时候才能被激活。
class Count {
public count = 0;
private lock = ReentrantLock();
private Condition condition = lock.newCondition();
public void add() {
lock.lock();
count += 1;
condition.signalAll();
lock.unlock();
}
public void minus() {
lock.lock();
while (count < 10)
condition.await();
count -= 10;
lock.unlock();
}
}
// 调用数数类
class Foo {
public static Co... 阅读全帖
c***c
发帖数: 21374
34
来自主题: Programming版 - 多线程编程前景如何?
现在N core的处理器越来越多了
专门针对多线程优化过的应用还不够多
多线程编程,特别c/c++多线程编程,会在啥时候成为主流呢?
g*********s
发帖数: 1782
35
来自主题: Programming版 - 多线程下的gdb core dump问题
多线程程序里有memory corruption,产生了core dump。用gdb -core core_file,然
后bt,看到crash的地方有些莫名其妙。是不是别的线程crash,但是core dump针对主
线程?
另外gdb->bt的结果能自动保存到文件里么?现在我是从屏幕上复制下来写到文件里,
没法自动化。
e******r
发帖数: 623
36
如果我创建完线程以后,main()直接就return 0了,是不是那些线程也同时就都被强行
中止了?
r****o
发帖数: 1950
37
我想问一下join和yield的区别。
是不是join等其他线程结束,而yield可以和其他线程一起竞争?
m********r
发帖数: 334
38
来自主题: Programming版 - 关于多线程编程的一个问题
程序有两个线程,一个线程的某个函数什么情况下会修改另一个线程的全局变量?怎么
避免?
x****u
发帖数: 44466
39
这个仅仅在gcc的非线程安全的优化模式下才有意义。
现在几乎没有这样的程序非要单线程的极端优化,MSVC也是默认不破坏多线程语义。
x****u
发帖数: 44466
40
不写出来甚至不够提交bug的,还是停留在推测阶段。
GCC甚至有了专门的option保证static的多线程安全,而且多线程也已经是最常用的
option之一了,很难想象它会为了优化破坏global的线程安全性。

thr
,
app
z****e
发帖数: 2024
41
来自主题: Programming版 - 多线程计时不准std::thread尝鲜 问题
为什么多线程计时的时候就不准了呢?
mywork是一个干活的类,里边对n1和n2分别进行计算,用cal1和cal2函数。
然后生成两个线程类,都引用同一个mywork,算cal1和cal2.
比较对象是一个普通函数f()。
我明明,用手表计时,发现多线程是快的,大概19秒左右完成,看任务管理器的cpu实用状态也大体符合20秒。
怎么用程序计时,就是这个输出了呢?太奇怪了,真着急。
output:
1000000000
33.84 seconds elapsed for multithreading.(这句话出现的时候,其实是20秒)
1000000000
27.82 seconds elapsed for one thread.
以下是源码。
#include
#include
#include
using namespace std;
const long long int M=5e8;
class mywork{
public:
mywork():n1(1),n2(1),flag1(0),flag2(0){}
void
z****e
发帖数: 2024
42
来自主题: Programming版 - 多线程计时不准std::thread尝鲜 问题
我的明白了,
原来clock是程序一共用了多少clock tick,是cpu time,多线程当然两个全算了啊。
所以诸位注意,多线程切不可用clock来计时。
这就有新问题了,如何多线程精确计时呢?
g***l
发帖数: 2753
43
就是普通的两个linux thread,一个semaphore.
thread 1:
semaphore_wait(sem);
xxxxxx。。。。。
semaphore_signal(sem);
thread 2:
while(true)
{
semaphore_wait(sem);
xxxx......
semaphore_signal(sem);
}
现在的问题是thread 1被这个sema给block住了,根本没有机会去抢到这个sema,而
thread 2在不停的hold和release这个sema。
如果在thread2 process_sleep()一下,thread1就可以了。
两个线程的优先级是一样的。调度方式也是RR。
我的问题是:
thread1在等待一会是可以的,但是如果thread2释放了sema,scheduler 不是马上会把
正在等待sema的线程转为当前活动线程?
非常感谢!!
M**u
发帖数: 10158
44
来自主题: Programming版 - 关于线程读写全局变量的问题
有一个全局变量flag,初始化为0
然后线程A写这个变量flag=1
另外一个线程B不停地读这个变量
while (flag != 1)
sleep (5); //waiting for flag to set as 1
thread_B_do_real_thing_with_flag_1 ();
没有别的线程操作这个flag,请问这种情况下,需要加锁么?
我感觉pthread_cond_wait做这个更好一点
x**n
发帖数: 1055
45
两个线程都是按照时间步dt循环
t_msvc线程:
for(t=0;t {
bt_param->brr->wait()
//这里停下来同步传信息给t_mingw
bt_param->brr->wait()
//到这里需要同步的内容结束
t_msvc自己的计算...
}
t_mingw线程:
for(t=0;t {
bt_param->brr->wait()
//这里停下来同步传信息给t_msvc
bt_param->brr->wait()
//到这里需要同步的内容结束
t_mingw自己的计算...
}
基本就是上面的框架,不知是不是解释清楚了,谢谢!
A*****i
发帖数: 3587
46
来自主题: Programming版 - 单线程多线程说到底
别闹了行么?该干啥去干啥,一个多线程让您吹成绿卡神器了
还扯上大脑结构了,卧槽,吐槽无力
您大脑结构是万线程的,满意了?
x****u
发帖数: 44466
47
来自主题: Programming版 - 单线程一般都是历史原因
闪不闪取决于是否用buffer,和单线程多线程无关。
现代的GUI引擎非常类似浏览器,工作线程一大堆。
H******7
发帖数: 1728
48
来自主题: Programming版 - 用python写多线程。刘姥姥都笑了
看到有人讨论python写多线程。笑死了。
还不如用java写呢。
多线程还得看c++的。boost, std多线程甩其他语言几个光年
z****e
发帖数: 54598
49
来自主题: Programming版 - 用python写多线程。刘姥姥都笑了
顺便跟你说一下哈
刚我试了下,爆了大概3000个进去
感觉没啥延迟
因为fps控制在30,然后平均过去每次间隔时间是
1000/30=33ms
33ms要把所有的units全部弄一遍,感觉也没有多困难
至少我的机器没有出现问题
客户端所有的命令都被简化,从本质上说
其实还没有ai思考所消耗的时间长
如果把电脑ai思考也放入那个grid的thread去做的话
其次因为server不需要处理图像,节省下来的各种资源实在是太宽裕了
你这3000个感觉还不如我自己自娱自乐时候爆的300个units耗资源呢
因为我自己玩的话,需要图像处理,需要塞入ai在主线程中,都比多线程吃资源
这种并发,很大一部分都交给了辅助线程
轻轻松松,如果再丢入几十g的内存,5w小问题,呵呵
用这种方式,最大的问题可能来自gc,不过gc停顿的latency还没有网络的latency的一半
完全可以忽略掉,lol,过两天去学校,我爆一个几十g内存的instance试试
跑个5w并发,感觉没啥难的
你前面说300多个连接都很困难,原因也很简单,你用tcp没有办法
网络游戏大部分都用的是udp,而且5w时eye online... 阅读全帖
z****e
发帖数: 54598
50
来自主题: Programming版 - 用python写多线程。刘姥姥都笑了
激动啥,我已经从学校回来了
弄了一个16vcpu,32g的instance
然后我们爆了3000个threads
用另外20个instances,每个是10vcpu,每个instance爆15个threads
每个thread控制一个unit,互相射
然后把hp调高,这样短时间内不会射死对方,同时用随机数降低活动频率
如果不控制,电脑计算飞快,很快就会发送一堆请求,人脑没那么灵活
.1秒能发送一个命令就不错了
最后并没有出现什么延迟的问题
server side跟我预想的一样,因为不需要处理图像和ai
所以复杂度大幅降低,33ms的主循环可以搞定
绝大多数时间在处理网络的io上,广播时候用async做点处理
这样循环就不会被打断,真正的主线程处理逻辑操作需要时间其实很少
33ms没啥问题,当然复杂度越高,能支持的并发数也就越少
你可以说我们做的游戏复杂度偏低
但是我不认为网游server需要多高的复杂度,哪怕是3d建模,也不会有多复杂
x,y,z三个维度,没啥难的,你非要做复杂来,那没办法
我搞定鸟,下次把这个写在我们的项目说明上
你不信就算了,我对这个话题已经没啥兴趣了
你就是嘴巴上... 阅读全帖
首页 上页 1 2 3 4 5 6 7 8 9 10 下页 末页 (共10页)