一个CPU可以为很多线程服务

一个CPU可以为很多线程服务,但一个线程无法让多个CPU为它服务,如果用JAVA写多线程程序,可以有几个线程运行在同一个CPU上,但是其中的一个线程一旦被分配到了某个CPU,那么这个线程就只由这个CPU来提供服务了

有一个程序A,需要改成单机并行模式,在4核的电脑上跑。可是不管我是自己启动多个计算线程还是使用openmp,始终只有一个核占用全满,另几个CPU核占用率都是0。下面是我做的几个实验。编程环境vs2005,MS编译器。计算机是amdCPU4核,2G内存,windowsXP操作系统。并行测试程序采用一个50000000次的for循环计算pai值。
1、使用新建的vc工程(控制台或者win32应用程序),实现多线程或者使用openmp实现并行计算,所有CPU都充分利用了。计算速度线性提升。说明并行算法没有错误。
2、直接在A程序中加入并行的程序,发现只有1个核运行。调试时可以看到多个线程确实启动了,多个线程在争抢一个CPU核!
3、直接在A程序中main函数一开始就调用并行程序,结果一样,只用一个。唉
4、除了主程序main()外,把所有其他类、函数、文件,乱七八糟都移除,但是并没有改环境配置。编译执行,多个CPU都用上了。说明问题不是由于项目环境的设置产生的。
综上,初步怀疑是工程中某个文件使用#define定义了什么标识影响到多核的使用。这个程序很大,百万行代码量,光是#define就上千个,文件间相互引用频繁,难以采用排除的方式看出什么影响CPU。
另外,今天看到资料说可以使用进程线程的亲缘性给线程指定CPU,我还没有试,担心情况不容乐观。OS自己不给分,指定划分怕是是更玄。

找到了!原来是程序一个类的构造函数中指定了一句话SetProcessAffinityMask( GetCurrentProcess(), 1 );找了n多天,终于明白了

如果是单核CPU,在某个时间点只能执行一个线程,但是多核CPU你可以理解为多个单核CPU,当然可以同时执行多个线程啦。


追问

如果是同时运行的,那么两个线程在同时使用一个变量的时候怎么办?


追答

1)两个线程是可以共享一个对象实例的,但是需要使用锁机制,即无论是读还是写,在使用前获取lock,使用完free lock,如果读写操作对性能消耗不大,可以考虑自旋锁
2)如果读或者写操作,有任何一个比较耗时,则需要考虑是否系统有软件狗机制,在这种情况下,需要考虑初始化软件狗,避免进程复位。


追问

我的意思是假如两个线程都同时执行到b=b+1;又没有同步锁,那怎么同时使用变量b。


现状:
服务器为64核,有多种类型的线程,其中一种线程的线程数目前设置为5,但是在特殊情况下(某个时间点数据突发量大时)处理能力无法满足需求。暂时的解决办法是提高设置的线程数。
So:
1、向各位请教一下Java如何依据cpu核数设置合适的线程数。
2、多种类型的线程的线程数总和太多是否会对服务器的应用产生不好影响


1:获取cpu核心数:

1 Runtime.getRuntime().availableProcessors();


创建线程池:

1 Executors.newFixedThreadPool(nThreads);//nThreads为线程数


2:这个只要服务器内存够大,CPU核心数较多,处理数据比较强就好了,注意不要一下分配几千个线程,可 能会导致堆栈溢出的,这样程序就挂了,因为线程很费内存资源

你可能感兴趣的:(时时疑问)