PThread ,Win32 和Java线程库
首先来跟大家聊一下什么是线程,相信有不少人听过进程和线程的概念,粗浅的说我们电脑中每运行一个exe文件即可视为一个进程被运行,而在这个exe程序中可能会有很多子过程在并发运行,这些子过程就是线程。
而我们经常用到的包括Java工程师用到的Java线程库,包含Windows系统中常用的Win32线程库,以及Posix中定义的Pthread线程库。虽然不同的平台的库不一样但是线程的思想是相通的。下面我就拿我比较熟悉的Pthread线程库来简单讲一下。
操作系统中有线程和进程两个概念。进程就像是工厂的一个车间,每开一个车间,操作系统需要给他分配一定的资源。而线程就像是每个车间的工人,每个工人可以去做不同的事情,比如工人A制作车轮,工人B制作发动机,工人C进行组装等等。因此线程可以“勉强”看作是进程的一个子概念。进程是资源分配的最小单元,而线城是分配处理器和调度的最小单元。
那么多线程是什么呢?就是每个车间有多个工人,工人们在有的地方独享资源,有的地方共享资源;就像工人们有独自的工作台,但是他们共享一条传送带。单线程就是说一个车间只有一个工人工作,多线程意思是每个车间多个工人工作。如下图:
概念引入完毕接下来谈一些实际的。我们知道每个进程有其独立的物理地址空间和内存资源,但是同一进程下面的线程并不拥有完全独立的系统资源。
**同一进程下面的线程共享资源包括代码段,数据段,文件区,堆空间等等。而每个线程独享的包括栈空间,寄存器,程序计数器等。**引用书上的图来描述:
为什么要引入多线程的概念呢?那是因为多线程有他的一些特点:
-
多线程处理的响应度比较高。比如我们的网页,可以一边等待用户输入,另外一边装载图片进入页面。
-
多线程他的同一进程下的多个线程共享部分资源,这样子方便线程之间的通信(线程中的一种通信方式----共享内存)
-
线程速度快。线程的创建和管理,线程之间的切换要比进程的要快,简单。
-
多线程更能够充分利用多核处理器,使得运行速度变快,增加了并发性。
线程呢又分为有用户线程和内核线程。用户线程受内核支持。用户线程和内核线程之间分为三种关系:
- 多*(用户线程)对一(内核线程)*模型;特点是运行效率高,但是缺点是,当一个线程阻塞的话,整个进程会被阻塞。
- 一对一模型;一个用户线程对应一个内核线程,这样子一个线程阻塞,其他线程可继续运行,提高了并行性,缺点是内核线程开销大,限制了系统所支持的线程数。
- 多对多模型;多个用户线程对应在多个内核线程上面。它既可以开多个用户线程,而且一个线程阻塞也不影响其他线程的执行。
接下来我就使用多线程来计算一下1-100求和
#include <iostream>
#include <pthread.h>
using namespace std;
int sum;
int count;
void* runner(void* args);
int main()
{
count=100;
pthread_t t[4];
int i;
int ret;
for(i=0;i<4;i++)
{ //创建四个线程,并且返回创建信息
ret=pthread_create(&t[i],NULL,runner,NULL);
if(ret!=0)
{
cout<<"pthread create failed"<<endl;
}
}
//等待四个结束
for(i=0;i<4;i++)
{
pthread_join(t[i],NULL);
}
cout<<sum;
return 0;
}
void* runner(void* args)
{
while(true)
{ //不断对让sum累加count,直到count<0
if(count>=0)
{
sum+=count;
count--;
}
else
{
break;
}
}
}
------------------------有疑问的请联系1124397151@qq.com--------------------------