精华内容
下载资源
问答
  • 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

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

    千次阅读 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++中多线程编程是不是线程越多越好

    千次阅读 多人点赞 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







    展开全文
  • Less is More这次越多越好 走近世界之最的多线程、多核心处理器.pdf
  • 码农小光关注 72020.04.18 00:04:50字数 3,178阅读 9,004 来源公众号:于日拱一兵 作者:tan日拱一兵 你有一个思想,我有一个思想,我们交换后,一个人就有两个...既然多线程编程容易出错,为什么它还经久不...

    码农小光

    来源公众号:于日拱一兵
    作者:tan日拱一兵

    • 你有一个思想,我有一个思想,我们交换后,一个人就有两个思想
    • If you can NOT explain it simply, you do NOT understand it well enough

    image

    为什么要使用多线程?

    防止并发编程出错最好的办法就是不写并发程序

    image

    既然多线程编程容易出错,为什么它还经久不衰呢?

    A:那还用说,肯定在某些方面有特长呗,比如你知道的【它很快,非常快】

    我也很赞同这个答案,但说的不够具体

    并发编程适用于什么场景?

    如果问你选择多线程的原因就是一个【快】字,面试也就不会出那么多幺蛾子了。你有没有问过你自己

    1. 并发编程在所有场景下都是快的吗?
    2. 知道它很快,何为快?怎样度量?

    想知道这两个问题的答案,我们需要一个从【定性】到【定量】的分析过程

    使用多线程就是在正确的场景下通过设置正确个数的线程来最大化程序的运行速度(我感觉你还是啥也没说)

    将这句话翻译到硬件级别就是要充分的利用 CPU 和 I/O 的利用率

    image

    两个正确得到保证,也就能达到最大化利用 CPU 和 I/O的目的了。最关键是,如何做到两个【正确】?

    在聊具体场景的时候,我们必须要拿出我们的专业性来。送你两个名词 buff 加成

    • CPU 密集型程序
    • I/O 密集型程序

    CPU 密集型程序

    一个完整请求,I/O操作可以在很短时间内完成, CPU还有很多运算要处理,也就是说 CPU 计算的比例占很大一部分

    假如我们要计算 1+2+....100亿 的总和,很明显,这就是一个 CPU 密集型程序

    在【单核】CPU下,如果我们创建 4 个线程来分段计算,即:

    1. 线程1计算 [1,25亿)

    2. ...... 以此类推

    3. 线程4计算 [75亿,100亿]

    我们来看下图他们会发生什么?

    image

    由于是单核 CPU,所有线程都在等待 CPU 时间片。按照理想情况来看,四个线程执行的时间总和与一个线程5独自完成是相等的,实际上我们还忽略了四个线程上下文切换的开销

    所以,单核CPU处理CPU密集型程序,这种情况并不太适合使用多线程

    此时如果在 4 核CPU下,同样创建四个线程来分段计算,看看会发生什么?

    image

    每个线程都有 CPU 来运行,并不会发生等待 CPU 时间片的情况,也没有线程切换的开销。理论情况来看效率提升了 4 倍

    所以,如果是多核CPU 处理 CPU 密集型程序,我们完全可以最大化的利用 CPU 核心数,应用并发编程来提高效率

    I/O密集型程序

    与 CPU 密集型程序相对,一个完整请求,CPU运算操作完成之后还有很多 I/O 操作要做,也就是说 I/O 操作占比很大部分

    我们都知道在进行 I/O 操作时,CPU是空闲状态,所以我们要最大化的利用 CPU,不能让其是空闲状态

    同样在单核 CPU 的情况下:

    image

    从上图中可以看出,每个线程都执行了相同长度的 CPU 耗时和 I/O 耗时,如果你将上面的图多画几个周期,CPU操作耗时固定,将 I/O 操作耗时变为 CPU 耗时的 3 倍,你会发现,CPU又有空闲了,这时你就可以新建线程 4,来继续最大化的利用 CPU。

    综上两种情况我们可以做出这样的总结:

    线程等待时间所占比例越高,需要越多线程;线程CPU时间所占比例越高,需要越少线程。

    到这里,相信你已经知道第一个【正确】使用多线程的场景了,那创建多少个线程是正确的呢?

    创建多少个线程合适?

    面试如果问到这个问题,这可是对你理论和实践的统考。想完全答对,你必须要【精通/精通/精通】小学算术

    从上面知道,我们有 CPU 密集型和 I/O 密集型两个场景,不同的场景当然需要的线程数也就不一样了

    CPU 密集型程序创建多少个线程合适?

    有些同学早已经发现,对于 CPU 密集型来说,理论上 线程数量 = CPU 核数(逻辑)就可以了,但是实际上,数量一般会设置为 CPU 核数(逻辑)+ 1, 为什么呢?

    《Java并发编程实战》这么说:

    计算(CPU)密集型的线程恰好在某时因为发生一个页错误或者因其他原因而暂停,刚好有一个“额外”的线程,可以确保在这种情况下CPU周期不会中断工作。

    所以对于CPU密集型程序, CPU 核数(逻辑)+ 1 个线程数是比较好的经验值的原因了

    I/O密集型程序创建多少个线程合适?

    上面已经让大家按照图多画几个周期(你可以动手将I/O耗时与CPU耗时比例调大,比如6倍或7倍),这样你就会得到一个结论,对于 I/O 密集型程序:

    最佳线程数 = (1/CPU利用率) = 1 + (I/O耗时/CPU耗时)

    我这么体贴,当然担心有些同学不理解这个公式,我们将上图的比例手动带入到上面的公式中:

    image

    这是一个CPU核心的最佳线程数,如果多个核心,那么 I/O 密集型程序的最佳线程数就是:

    最佳线程数 = CPU核心数 * (1/CPU利用率) = CPU核心数 * (1 + (I/O耗时/CPU耗时))

    说到这,有些同学可能有疑问了,要计算 I/O 密集型程序,是要知道 CPU 利用率的,如果我不知道这些,那要怎样给出一个初始值呢?

    按照上面公式,假如几乎全是 I/O耗时,所以纯理论你就可以说是 2N(N=CPU核数),当然也有说 2N + 1的,(我猜这个 1 也是 backup),没有找到具体的推倒过程,在【并发编程实战-8.2章节】截图在此,大家有兴趣的可以自己看看

    image

    理论上来说,理论上来说,理论上来说,这样就能达到 CPU 100% 的利用率

    如果理论都好用,那就用不着实践了,也就更不会有调优的事出现了。不过在初始阶段,我们确实可以按照这个理论之作为伪标准, 毕竟差也可能不会差太多,这样调优也会更好一些

    谈完理论,咱们说点实际的,公式我看懂了(定性阶段结束),但是我有两个疑问:

    1. 我怎么知道具体的 I/O耗时和CPU耗时呢?
    2. 怎么查看CPU利用率?

    没错,我们需要定量分析了

    幸运的是,我们并不是第一个吃螃蟹的仔儿,其实有很多 APM (Application Performance Manager)工具可以帮我们得到准确的数据,学会使用这类工具,也就可以结合理论,在调优的过程得到更优的线程个数了。我这里简单列举几个,具体使用哪一个,具体应用还需要你自己去调研选择,受篇幅限制,暂不展开讨论了

    1. SkyWalking
    2. CAT
    3. zipkin

    上面了解了基本的理论知识,那面试有可能问什么?又可能会以怎样的方式提问呢?

    面试小问

    小问一

    假设要求一个系统的 TPS(Transaction Per Second 或者 Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s

    如何设计线程个数,使得可以在1s内处理完20个Transaction?

    image

    但是,但是,这是因为没有考虑到CPU数目。家里又没矿,一般服务器的CPU核数为16或者32,如果有80个线程,那么肯定会带来太多不必要的线程上下文切换开销(希望这句话你可以主动说出来),这就需要调优了,来做到最佳 balance

    小问二

    计算操作需要5ms,DB操作需要 100ms,对于一台 8个CPU的服务器,怎么设置线程数呢?

    如果不知道请拿三年级期末考试题重新做(今天晚自习留下来),答案是:

    线程数 = 8 * (1 + 100/5) = 168 (个)

    那如果DB的 QPS(Query Per Second)上限是1000,此时这个线程数又该设置为多大呢?

    image

    同样,这是没有考虑 CPU 数目,接下来就又是细节调优的阶段了

    因为一次请求不仅仅包括 CPU 和 I/O操作,具体的调优过程还要考虑内存资源,网络等具体内容

    增加 CPU 核数一定能解决问题吗?

    看到这,有些同学可能会认为,即便我算出了理论线程数,但实际CPU核数不够,会带来线程上下文切换的开销,所以下一步就需要增加 CPU 核数,那我们盲目的增加 CPU 核数就一定能解决问题吗?

    在讲互斥锁的内容是,我故意遗留了一个知识:

    image

    怎么理解这个公式呢?

    image

    这个结论告诉我们,假如我们的串行率是 5%,那么我们无论采用什么技术,最高也就只能提高 20 倍的性能。

    如何简单粗暴的理解串行百分比(其实都可以通过工具得出这个结果的)呢?来看个小 Tips:

    Tips: 临界区都是串行的,非临界区都是并行的,用单线程执行临界区的时间/用单线程执行(临界区+非临界区)的时间就是串行百分比

    现在你应该理解我在讲解 synchronized 关键字时所说的:

    最小化临界区范围,因为临界区的大小往往就是瓶颈问题的所在,不要像乱用try catch那样一锅端

    总结

    多线程不一定就比单线程高效,比如大名鼎鼎的 Redis (后面会分析),因为它是基于内存操作,这种情况下,单线程可以很高效的利用CPU。而多线程的使用场景一般时存在相当比例的I/O或网络操作

    另外,结合小学数学题,我们已经了解了如何从定性到定量的分析的过程,在开始没有任何数据之前,我们可以使用上文提到的经验值作为一个伪标准,其次就是结合实际来逐步的调优(综合 CPU,内存,硬盘读写速度,网络状况等)了

    最后,盲目的增加 CPU 核数也不一定能解决我们的问题,这就要求我们严格的编写并发程序代码了

    灵魂追问

    1. 我们已经知道创建多少个线程合适了,为什么还要搞一个线程池出来?
    2. 创建一个线程都要做哪些事情?为什么说频繁的创建线程开销很大?
    3. 多线程通常要注意共享变量问题,为什么局部变量就没有线程安全问题呢?
    4. ......

     

     

    展开全文
  • Java应用中线程是不是开的越多越好,开多少合适,如何减少上下文切换开销?,如何写个shell脚本获取上下文切换的开销?
  • C++多线程多少个线程

    千次阅读 2018-10-25 16:54:08
    那么,是不是线程越多越好呢? 假设我们有100个下载任务,我们可以有以下3种实现方法: 使用一个线程,依次执行100个下载任务; 使用100个线程,每个线程执行一个下载任务; 使用10个线程,每个线程依次执行10个...
  • 多线程下载并不是并发下载线程越多越好,因为当用户开启太多的并发线程之后,应用程序需要维护每条线程的开销,线程同步的开销。 这些开销反而会导致下载速度降低。因此需要避免在代码中直接开启大量线程执行下载。 ...
  • JAVA线程多线程

    千次阅读 多人点赞 2016-08-25 19:10:10
    去安卓面试的时候通常会问一些java问题,所以呢你可能觉得答问题时...多线程的运行是根据CPU切换完成,如何切换由CPU决定,因此多线程运行具有不确定性。● 线程java中的线程使用java.lang.Thread类或者java.lang.Ru
  • 电话面试的面试题,有一个线程负责读取任务数据放到内存队列,现在开了50个线程做任务处理,然后面试官就问任务处理线程是否越多越好,不考虑内存限制,也不考虑线程间的资源争夺。这道题更像是开放性的题目,我能...
  • 比如,有时候,我们的线程内部的计算需要在磁盘读取数据,这样就会使得当前线程等待,操作系统就可能智能的把它挂起了,它的计算资源又被其它线程使用了,等到数据准备完毕之后,操作系统又将挂起的线程以及他的资源...
  • 多线程多少算

    千次阅读 2016-10-03 00:56:41
    关于多线程的一点思考:真正干活的不是线程,而是CPU;线程越多,干活不一定越快
  • 多线程的应用场景以及其实现方式

    千次阅读 2017-02-20 22:18:01
    一、线程的概要绍 从员工搬货看多线程 现在有一大推货物堆着,如果我有5个员工搬,肯定会比一个员工搬要...所以,这就不意味着线程越多越好,合理的使用多线程,可以充分提升处理器的利用率,提高工作效率线程与进程
  • java线程优先级先执行吗

    千次阅读 2016-04-01 14:13:58
    不是优先级越高,线程就先执行 优先级反映的是线程占用资源的多少,优先级越高,占用的资源越多,性能越好
  • 进程与多线程区别

    万次阅读 多人点赞 2016-04-21 10:01:16
    在Unix上编程采用多线程还是进程的争执由来已久,这种争执最常见到在C/S通讯中服务端并发技术 的选型上,比如WEB服务器技术中,Apache是采用进程的(perfork模式,每客户连接对应一个进程,每进程中只存在唯一一...
  • 多线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而semaphore信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动...
  • 异步多线程

    千次阅读 2017-11-23 21:11:32
    1.首先讲解一下进程、线程多线程的概念 进程-线程 计算机概念 进程是一个程序在电脑上运行时,全部计算资源的合集叫进程。 线程是程序的最小执行单位,包含计算资源,任何一个操作的响应都是线程多线程个...
  • Python 线程 多线程 线程池

    千次阅读 2018-08-24 13:56:16
    多线程, 线程池测试: Python 使用多线程,有两种方式:函数,或者用类来包装线程对象。 现在有一个需求:如下图,我们需要把test.jpg 复制5000次到update文件夹下面。并且在复制过程中需要重命名,命名规则为 ...
  • 多线程面试题(值得收藏)

    万次阅读 多人点赞 2019-08-16 09:41:18
    史上最强多线程面试47题(含答案),建议收藏 金九银十快到了,即将进入找工作的高峰期,最新整理的最全多线程并发面试47题和答案总结,希望对想进BAT的同学有帮助,由于篇幅较长,建议收藏后细看~ 1、并发编程三要素?...
  • 线程多线程的区别

    万次阅读 多人点赞 2017-11-27 11:03:18
    什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括...而一个进程又是由线程所组成的。 什么是线程线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区
  • C# 多线程

    万次阅读 多人点赞 2019-05-29 17:56:35
    一、基本概念 1、进程 首先打开任务管理器,查看当前运行的进程: 从任务管理器里面可以看到当前所有正在运行的进程。...线程是操作系统分配处理器时间的基本单元,在进程中可以有线程同时执行代码。进...
  • Java多线程总结

    万次阅读 2018-02-07 19:33:19
    如:为什么你需要使用线程, 如何创建线程,用什么方式创建线程比较(比如:继承thread类还是调用Runnable接口),然后逐渐问到并发问题像在Java并发编程的过程中遇到了什么挑战,Java内存模型,JDK1.5引入了哪些...
  • Java多线程面试题

    万次阅读 2020-10-25 15:56:40
    sleep 方法: 是 Thread 类的静态方法,当前线程将睡眠 n 毫秒,线程进入阻塞状态。当睡眠时间到了,会解除阻塞,进行可运行状态,等待 CPU 的到来。睡眠不释放锁(如果有的话); wait 方法: 是 Object 的方法...
  • 多线程

    千次阅读 2016-05-25 18:10:40
    一、线程生命周期共五个状态: 新建状态: Thread t = new Thread() 就绪状态 调用start()方法, 运行状态  使用yield()方法可以使线程主动放弃CPU。线程也可能由于执行结束或执行stop()方法进入死亡状态。每个...
  • 编程思想之多线程进程(3)——Java中的多线程

    万次阅读 多人点赞 2015-06-28 20:49:35
    在程序需要同时执行个任务时,可以采用多线程。Java给多线程编程提供了内置的支持,提供了两种创建线程方法:1.通过实现Runable接口;2.通过继承Thread类。 Thread是JDK实现的对线程支持的类,Thread类本身实现了...
  • },很容易就可以实现我们自定义的并行化循环操作,在并行循环体中,还可以操作外部的变量,这个特性是很其他语言所没有的,当然其他语言,诸如JAVA之类,完全可以采用我们在第二篇所介绍的方法自己生成并行化操作...
  • 重点将关注如何在实际项目中更好的使用多线程,因为我相信可能有很多项目中可能并不需要我们使用多线程,或者说开发人员并没有注意到可以使用多线程,其次多线程也并不是创建的越多越好,再加上共享资源下线程安全,...
  • 什么是进程? 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。...多线程是指程序中包含个执行流,即在一个程序中可以同时运行个不同的线程来执行不同的任务, 也...
  • 多线程下载技术论文

    2013-03-09 10:50:57
    关键词:多线程;线程安全;断点续传 线程可以理解为下载的通道,一个线程就是一个文件的下载通道,多线程也就是同时开起几个下载通道.当服务器提供下载服务...线程越多,下载速度越快.当前的下载软件都支持多线程技术.
  • iOS 多线程

    千次阅读 2016-04-21 22:02:06
    什么是进程? 进程是指在系统中正在运行的一个应用程序。 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内。 什么是线程? 1个进程要想执行任务,必须得有线程... - 如果要在1个线程中执行个任务

空空如也

空空如也

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

线程越多越好