精华内容
下载资源
问答
  • c++中多线程编程是不是线程数越多越好

    千次阅读 多人点赞 2013-10-05 12:41:26
    多线程编程可以提高程序的并发执行能力,那是不是线程越多越好呢?

    多线程编程可以提高程序的并发执行能力,那是不是线程越多越好呢?

    大家可以参考下面的代码做测试:

    #define  MAX_WORKTHREAD		5
    map<int, int> m_task;//用于统计每个线程做的任务数
    std::deque<int> m_MsgQueue;//处理的消息队列
    	for (i=0; i<MAX_WORKTHREAD; i++)
    	{
    		int* nTemp = new int;
    		*nTemp = i;
    		hWTHandle[i] = CreateThread(NULL, 0, WorkThread, nTemp, 0, &g_dwWorkThread[i]); 
    		WorkThreadCout ++;
    		m_task[i] = 0;
    		Sleep(100);
    	}
    	
    DWORD WINAPI WorkThread(LPVOID lpParam)  
    {   
    	// cout << "No." << g_dwThreadID << " thread is running." << endl;  
    	while (TRUE)  
    	{  
    		int* nRemp = (int*)lpParam;
    
    		int n = -1;
    
    		EnterCriticalSection(&g_cs);
    		//cout << "No " << *nRemp << ", " << g_dwWorkThread[*nRemp] << " thread is running." << endl;
    		LeaveCriticalSection(&g_cs);
    
    		EnterCriticalSection(&g_MsgQueue);
    		if (!m_MsgQueue.empty())
    		{
    			n = m_MsgQueue.front();
    			m_MsgQueue.pop_front();
    		
    			m_task[*nRemp]++;
    		}
    		LeaveCriticalSection(&g_MsgQueue);
    
    		EnterCriticalSection(&g_cs);
    		cout << "No:" << *nRemp << ", " << n << endl;
    		LeaveCriticalSection(&g_cs);
    
    		Sleep(2000);//备注1
    
    	}  
    
    	cout << "No " << lpParam << " end" << endl;
    
    	return 0;  
    }

    当任务执行完了后,可以打印m_task里的数据:

    std::map<int, int>::iterator IterCount;
    for(IterCount=m_task.begin(); IterCount!=m_task.end();IterCount++)
    {
    	int nThreadId= (*IterCount).first;
    	int nCount = (*IterCount).second;
    					
    	EnterCriticalSection(&g_cs);
    	cout << "nThreadId:" << nThreadId << ", nCount" << nCount<<endl;
    	LeaveCriticalSection(&g_cs);
    
    	(*IterCount).second = 0;
    }


    可以修改备注1处的Sleep(2000),分别改为1000,3000,5000,10000等看看结果有什么区别?这里的时间其实是模拟执行一个任务所需要的时间,也可以用随机函数随机产生。

    另外,多线程操作全局变量的时候,一定要用线程同步(如临界区等)来操作,否则,会有问题。在使用的过程中,一定要注意资源和线程之间的关系,避免死锁发生。

    经过测试,多线程中的线程数是不是越多越好?这个问题的答案应该就有了。


    转载请注明原创链接:http://blog.csdn.net/wujunokay/article/details/12307773







    展开全文
  • 线程越多越好吗

    千次阅读 2019-10-06 19:13:40
    一会cpu利用率满了,内存也满了,说明线程不是越多越好,还得看内存能不能带动。 并且线程创建和销毁都要消耗很多时间的,如果创建消耗的时候大于执行任务的时候,就没有必要多线程了。 因为才有了线程池,...
    package SJMS;
    
    public class Test1 {
    	public static void main(String[] args) {
    
    		for (int i = 0; i < 10000000; i++) {
    
    			new Thread(new Runnable() {
    
    				public void run() {
    					try {
    						Thread.sleep(9000 * 9000 * 9);
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    				}
    			}).start();
    
    			System.out.println(i);
    		}
    
    	}
    }
    

     

    new出几十万个线程,并让其休眠很长时间,占用内存。一会cpu利用率满了,内存也满了,说明线程不是越多越好,还得看内存能不能带动。

    并且线程创建和销毁都要消耗很多时间的,如果创建消耗的时候大于执行任务的时候,就没有必要多线程了。

    因为才有了线程池,这样就避免了频繁创建消耗线程了。

     

    同时cpu频繁在各个线程之间切换影响性能。

     

    线程的本质,就是把代码送给cpu取执行

    我们需要做的就是选择合适数量的卡车,不断运输代码即可。

     

    展开全文
  • 比如,有时候,我们的线程内部的计算需要在磁盘读取数据,这样就会使得当前线程等待,操作系统就可能智能的把它挂起了,它的计算资源又被其它线程使用了,等到数据准备完毕之后,操作系统又将挂起的线程以及他的资源...


    首先我们应该知道,操作系统是如何使用线程的。每个进程中可以启动若干个线程,这些线程跟操作系统请求计算资源,操作系统也许没我们想的那么智能,它不一定按照我们想要的方式去讲线程与计算核心对应起来。


    比如,有时候,我们的线程内部的计算需要在磁盘读取数据,这样就会使得当前线程等待,操作系统就可能智能的把它挂起了,它的计算资源又被其它线程使用了,等到数据准备完毕之后,操作系统又将挂起的线程以及他的资源(寄存器数据,缓存数据)一同放到一个计算核心(计算资源)上(实际上操作系统可能不会吧所有缓存数据都拉出到内存,但是如果在第一个线程等待时,插入的线程的使用了大量缓存,你的原有缓存数据就极有可能被冲掉了,就需要重新缓存),当然这个时候你被唤醒的线程可能不会再原有的核心上了,总之这种线程切换的过程会使得你的线程计算时间变慢了。


    又比如,你的线程数量过多。这个情况下,如果线程的负载是雷同的,那么你的线程很可能被频繁切换,这样也会把时间变慢。不过不是说线程数比核心数少就好,这个要有个度。你的线程负载均衡的话,如果线程切换时间能很好的弥补掉线程挂起等待的时间,各个线程交错执行,完全占用计算资源,你的计算速度才会快。


    以上只是一时兴起,暂作之讨论,不正确的地方,烦请批评指正,欢迎跟帖讨论。

    展开全文
  • C++编程中是不是线程越多越好

    千次阅读 2014-03-09 09:20:24
    多线程编程可以提高程序的并发执行能力,那是不是线程越多越好呢? 大家可以参考下面的代码做测试: [cpp] view plaincopy #define MAX_WORKTHREAD 5  mapint, int> m_task;//...

    多线程编程可以提高程序的并发执行能力,那是不是线程越多越好呢?

    大家可以参考下面的代码做测试:

    [cpp]  view plain copy
    1. #define  MAX_WORKTHREAD     5  
    2. map<intint> m_task;//用于统计每个线程做的任务数  
    3. std::deque<int> m_MsgQueue;//处理的消息队列  
    4.     for (i=0; i<MAX_WORKTHREAD; i++)  
    5.     {  
    6.         int* nTemp = new int;  
    7.         *nTemp = i;  
    8.         hWTHandle[i] = CreateThread(NULL, 0, WorkThread, nTemp, 0, &g_dwWorkThread[i]);   
    9.         WorkThreadCout ++;  
    10.         m_task[i] = 0;  
    11.         Sleep(100);  
    12.     }  
    13.       
    14. DWORD WINAPI WorkThread(LPVOID lpParam)    
    15. {     
    16.     // cout << "No." << g_dwThreadID << " thread is running." << endl;    
    17.     while (TRUE)    
    18.     {    
    19.         int* nRemp = (int*)lpParam;  
    20.   
    21.         int n = -1;  
    22.   
    23.         EnterCriticalSection(&g_cs);  
    24.         //cout << "No " << *nRemp << ", " << g_dwWorkThread[*nRemp] << " thread is running." << endl;  
    25.         LeaveCriticalSection(&g_cs);  
    26.   
    27.         EnterCriticalSection(&g_MsgQueue);  
    28.         if (!m_MsgQueue.empty())  
    29.         {  
    30.             n = m_MsgQueue.front();  
    31.             m_MsgQueue.pop_front();  
    32.           
    33.             m_task[*nRemp]++;  
    34.         }  
    35.         LeaveCriticalSection(&g_MsgQueue);  
    36.   
    37.         EnterCriticalSection(&g_cs);  
    38.         cout << "No:" << *nRemp << ", " << n << endl;  
    39.         LeaveCriticalSection(&g_cs);  
    40.   
    41.         Sleep(2000);//备注1  
    42.   
    43.     }    
    44.   
    45.     cout << "No " << lpParam << " end" << endl;  
    46.   
    47.     return 0;    
    48. }  

    当任务执行完了后,可以打印m_task里的数据:

    [cpp]  view plain copy
    1. std::map<intint>::iterator IterCount;  
    2. for(IterCount=m_task.begin(); IterCount!=m_task.end();IterCount++)  
    3. {  
    4.     int nThreadId= (*IterCount).first;  
    5.     int nCount = (*IterCount).second;  
    6.                       
    7.     EnterCriticalSection(&g_cs);  
    8.     cout << "nThreadId:" << nThreadId << ", nCount" << nCount<<endl;  
    9.     LeaveCriticalSection(&g_cs);  
    10.   
    11.     (*IterCount).second = 0;  
    12. }  


    可以修改备注1处的Sleep(2000),分别改为1000,3000,5000,10000等看看结果有什么区别?这里的时间其实是模拟执行一个任务所需要的时间,也可以用随机函数随机产生。

    另外,多线程操作全局变量的时候,一定要用线程同步(如临界区等)来操作,否则,会有问题。在使用的过程中,一定要注意资源和线程之间的关系,避免死锁发生。

    经过测试,多线程中的线程数是不是越多越好?这个问题的答案应该就有了。






    原创链接:http://blog.csdn.net/wujunokay/article/details/12307773

    展开全文
  • Kafka 分区数越多性能就越好吗?为什么? 我的理解: 每个分区都对应一个 log 文件,log 文件是顺序写的,但如果有非常多分区同时刷盘,就会变相成乱序写了,我猜想这也是为什么 RocketMQ 一个 broker 只会拥有一...
  • 码农小光关注 72020.04.18 00:04:50字数 3,178阅读 9,004 来源公众号:于日拱一兵 作者:tan日拱一兵 你有一个思想,我有一个思想,我们交换后,一个人就有两个...既然多线程编程容易出错,为什么它还经久不...
  • 多线程线程数设置多少合适

    千次阅读 2020-06-30 01:15:04
    首先要考虑到 CPU 核心,那么在 Java 中如何获取核心线程数? 可以使用 Runtime.getRuntime().availableProcessor() 方法来获取(可能不准确,作为参考) 或者直接去服务器查看 温故为什么使用线程 场景 如果有两...
  • java线程优先级先执行吗

    千次阅读 2016-04-01 14:13:58
    不是优先级越高,线程就先执行 优先级反映的是线程占用资源的多少,优先级越高,占用的资源越多,性能越好
  • Java应用中线程是不是开的越多越好,开多少合适,如何减少上下文切换开销?,如何写个shell脚本获取上下文切换的开销?
  • 多线程下载并不是并发下载线程越多越好,因为当用户开启太多的并发线程之后,应用程序需要维护每条线程的开销,线程同步的开销。 这些开销反而会导致下载速度降低。因此需要避免在代码中直接开启大量线程执行下载。 ...
  • 到底多少线程算是线程数

    千次阅读 2014-04-30 23:55:29
    我的问题是:像这样的I/O多线程,什么才是一个的临界点?我知道这需要一个粗略的估计值,但这个值应该是几百呢还是几千? 更新: 非常感谢你们所有的回答,看起来我需要去测试找出线程数上限,问题是:我怎么...
  • 一 cpu个、核数、线程数的关系 cpu个:是指物理上,也及硬件上的核心; 核数:是逻辑上的,简单理解为逻辑上模拟出的核心;...二 cpu线程数和Java多线程 首先明白几个概念: (1) 单个cpu线程在同...
  • CPU核心线程数的关系

    千次阅读 2019-01-01 14:33:24
    名称说明cpu个: 是指物理上,也及硬件上的核心; 核数: 是逻辑上的,简单理解为...线程数越多,越有利于同时运行多个程序,因为线程数等同于在某个瞬间CPU能同时并行处理的任务。 AMD线程数: 线程数...
  • 所以有人建议说:线程数为核数的两倍最好。 其实只要这些线程不频繁切换、竞争资源的话。想要最优性能,还是根据具体项目慢慢调试。 CPU切不切换我们没法控制,只能提高线程优先级以获取更的CPU时间。 CPU除了处理...
  • CPU,核心线程数的关系

    千次阅读 2020-08-05 10:58:04
    1、存在形式不同: (1)CPU:独立的中央处理单元,体现在主板上就是有多少个CPU槽位 (2)CPU核心(CPU cores):在每一个CPU上,都可能有多核(core),每个核...线程数越多,越有利于同时运行多个程序,因为
  • JAVA线程多线程

    千次阅读 多人点赞 2016-08-25 19:10:10
    去安卓面试的时候通常会问一些java问题,所以呢你可能觉得答问题时...多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。● 线程java中的线程使用java.lang.Thread类或者java.lang.Ru
  • 对于这样的任务最佳的线程数为 CPU 核心的 1~2 倍,如果设置过多的线程数,实际上并不会起到很的效果。此时假设我们设置的线程数量是 CPU 核心的 2 倍以上,因为计算任务非常重,会占用大量的 CPU 资源,所以...
  • 多线程多少算

    千次阅读 2016-10-03 00:56:41
    关于多线程的一点思考:真正干活的不是线程,而是CPU;线程越多,干活不一定越快
  • tomcat连接数线程数

    千次阅读 2016-12-05 16:53:35
    tomcat最大线程数的设置 Tomcat的server.xml中连接器设置如下   Connector port="8080" maxThreads="150" minSpareThreads="25" maxSpareThreads="75"  enableLookups="false" redir
  • Java 确定线程池中工作线程数的大小

    万次阅读 2018-09-12 16:20:17
    1、工作线程是不是越多越好?  不是。a、服务器cpu核数有限,所以同时并发或者并行的线程数是有限的,所以1核cpu设置1000个线程是没有意义的。  b、线程切换也是有开销的。频繁切换线程会使性能降低。 2、调用...
  • 线程数设多少合适

    千次阅读 2018-11-10 19:35:09
    ①工作线程数是不是设置的大越?  回答:肯定不是的  1)一来服务器CPU核数有限,同时并发的线程数是有限的,1核CPU设置10000个工作线程没有意义  2)线程切换是有开销的,如果线程切换过于频繁,反而会使...
  • Springboot内置Tomcat线程数优化

    千次阅读 2020-08-03 17:24:43
    操作系统做线程之间的切换调度是有系统开销的,所以不是越多越好。) server.tomcat.max-threads=800 # 最小工作空闲线程数,默认10。(适当增大一些,以便应对突然增长的访问量) server.tomcat.min-spare-thr.
  • CPU个、CPU核心、CPU线程数

    千次阅读 2018-09-28 11:46:53
    CPU个、CPU核心、CPU线程数 转载自:https://www.cnblogs.com/kimsimple/p/7787018.html  我们在选购电脑的时候,CPU是一个需要考虑到核心因素,因为它决定了电脑的性能等级。CPU从早期的单核,发展到现在的...
  • cpu核心并非越多越好

    千次阅读 2014-12-23 15:01:39
    加速比S=1/(a+(1-a)/n),其中a是指代码中不能并行运算的比例,n是并行处理节点。举个例子,如果一段代码可并行运算部分占80%,这段代码在一颗四核心CPU上运行,其加速比为S=1/(0.2+0.8/4)=2.5;若让这段代码在一颗...
  • tomcat是目前较为常用的Web容器,那么怎么配置tomcat才能使得自己的服务效率更高,今天我主要解释一下tomcat的最大线程数(maxThreads)、最大等待(acceptCount)和最大连接(maxConnections)。 **maxThreads...
  • Java线程池如何合理配置核心线程数?

    千次阅读 2020-08-26 10:46:52
    配置核心线程数 Java线程池如何合理配置核心线程数?分下面两个步骤分析: 第一步:先看下机器的CPU核数,然后再设定具体参数 CPU核数=Runtime.getRuntime().availableProcessors() System.out.println(Runtime....
  • 进程与多线程区别

    万次阅读 多人点赞 2016-04-21 10:01:16
    在Unix上编程采用多线程还是进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一...
  • 最大进程线程数 连接

    千次阅读 2018-10-07 18:03:02
    ======================== ========================================================= ==============================================...吞吐量(TPS)、QPS、并发、响应时间(RT)概念 开发的原因,需要对...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 186,766
精华内容 74,706
关键字:

线程数越多越好吗