一个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核心数较多,处理数据比较强就好了,注意不要一下分配几千个线程,可 能会导致堆栈溢出的,这样程序就挂了,因为线程很费内存资源
分享到:
相关推荐
2. **共享资源**:在多线程环境中,多个线程可能需要访问同一个数据或对象,这就形成了共享资源。 3. **竞态条件**:当两个或多个线程同时访问并修改共享资源时,如果没有适当的同步措施,可能导致数据的不一致性,...
在实际应用中,还需要考虑到多线程同步问题,确保数据的准确性。 总结起来,获取每个线程的CPU使用率是一项技术性很强的任务,涉及到对操作系统底层机制的理解以及使用相应的API或系统调用。通过分析和理解源代码,...
总之,这个压缩包提供了一个实践性的教学案例,涵盖了多进程、多线程编程、网络服务开发和性能测试等关键技能,对于提升开发者在Unix环境下的并发编程能力具有很大的帮助。通过学习和实践,可以加深对这些概念的理解...
线程是操作系统分配CPU时间的基本单元,一个进程可以包含多个线程,它们共享同一内存空间,各自执行不同的任务。通过创建多线程,程序可以在等待某个操作完成的同时,继续执行其他任务,从而提高了资源利用率和程序...
在多线程模型下,我们可以创建一个线程池,当有上传请求到来时,线程池会分配一个空闲线程来处理这个请求。这样,即使有很多用户同时上传文件,服务器也能有效地管理这些请求,避免因为单一线程处理而导致的阻塞问题...
Linux下的多线程编程是一种高效的程序设计方法,它可以将一个程序的任务划分为多个部分,每个部分是一个顺序控制流。多线程编程可以实现并行计算,高效利用多处理器,并且具有许多优点,如节约系统资源、方便的线程...
总之,这个多线程下载程序是一个很好的学习资源,它结合了VC++编程、多线程技术和网络编程,可以帮助开发者提升在这些领域的技能。通过分析和理解源码,我们可以了解到实际开发中如何有效地利用多线程来优化性能,...
例如,在一个多线程应用中,一个线程可以处理用户输入,而另一个线程则负责后台数据的加载。多线程也有其挑战,比如线程间的数据共享可能导致竞态条件、死锁等问题,需要使用锁或其他同步机制来避免。此外,线程创建...
多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。...
标题“ProcessTamer实现CPU多线程”揭示了一个名为ProcessTamer的软件工具,它的核心功能是优化和管理计算机系统中的多线程处理。这个工具旨在提高多任务环境下的性能,通过智能地分配系统资源,确保每个线程都能...
多线程的好处在于可以提高CPU的利用率——任何一个程序员都不希望自己的程序很多时候没事可干,在多线程程序中,一个线程必须等待的时候,CPU可以运行其它的线程而不是等待,这样就大大提高了程序的效率。...
多线程可以提高CPU的利用率,在多线程程序中,一个线程必须等待的时候,CPU可以运行其他的线程而不是等待,这样就大大提高了程序的效率。 四、多线程的好处: 1. 提高CPU的利用率:多线程可以让CPU同时执行多个任务...
OpenGL(Open Graphics Library)是一种性能卓越的三维图形标准,由 SGI 等多家世界知名的计算机软件公司倡导,以 SGI 的 GL 三维图形库为基础制定的一个通用共享的开放式三维图形标准。OpenGL 是图形硬件的一个软件...
在`ThdDemo`这个示例项目中,很可能是包含了一个完整的多线程应用实例,可能包括了线程同步、资源竞争等问题的处理。线程同步可以防止数据竞争,例如使用`WaitForSingleObject`、`Mutex`、`Semaphore`或`Event`等...
2. **资源利用率最大化**:多线程使得CPU的空闲时间减少,尤其是在多核处理器环境下,每个核心都可以处理一个线程,使得系统资源得到充分利用。 3. **任务独立性**:每个线程执行的任务相互独立,即使其中一个线程...
这个压缩包中的"多线程5.e"文件很可能包含了一个完整的多线程创建和管理模块,可能包括了线程启动、暂停、恢复和销毁等操作的函数或过程。 线程的启动是多线程编程的第一步,通常涉及到一个入口函数,该函数定义了...
Java 多线程编程是指在一个程序中可以运行多个线程,以提高程序的执行效率和响应速度。在 Java 中,多线程编程可以通过 Thread 类和 Runnable 接口来实现。 为什么需要多线程? 在单线程程序中,如果某个任务需要...
在IT行业中,多线程下载是一种常见的优化网络资源获取的技术,尤其在处理大文件如视频时,能够显著提高下载...这个demo项目为开发者提供了一个很好的学习和实践平台,有助于深入理解多线程编程和网络编程的相关知识。
多线程编程是 Java 编程中一个非常重要的概念,它可以提高程序的执行效率、响应速度和简洁性,但是也需要我们小心处理线程安全问题和死锁问题等挑战。 知识点: 1. 多线程编程的定义和优点。 2. 线程和进程的区别...