多线程浅谈

PThreadWin32Java线程库
首先来跟大家聊一下什么是线程,相信有不少人听过进程和线程的概念,粗浅的说我们电脑中每运行一个exe文件即可视为一个进程被运行,而在这个exe程序中可能会有很多子过程在并发运行,这些子过程就是线程。
而我们经常用到的包括Java工程师用到的Java线程库,包含Windows系统中常用的Win32线程库,以及Posix中定义的Pthread线程库。虽然不同的平台的库不一样但是线程的思想是相通的。下面我就拿我比较熟悉的Pthread线程库来简单讲一下。
操作系统中有线程和进程两个概念。进程就像是工厂的一个车间,每开一个车间,操作系统需要给他分配一定的资源。而线程就像是每个车间的工人,每个工人可以去做不同的事情,比如工人A制作车轮,工人B制作发动机,工人C进行组装等等。因此线程可以“勉强”看作是进程的一个子概念。进程是资源分配的最小单元,而线城是分配处理器和调度的最小单元。
那么多线程是什么呢?就是每个车间有多个工人,工人们在有的地方独享资源,有的地方共享资源;就像工人们有独自的工作台,但是他们共享一条传送带。单线程就是说一个车间只有一个工人工作,多线程意思是每个车间多个工人工作。如下图:
在这里插入图片描述
概念引入完毕接下来谈一些实际的。我们知道每个进程有其独立的物理地址空间和内存资源,但是同一进程下面的线程并不拥有完全独立的系统资源。
**同一进程下面的线程共享资源包括代码段,数据段,文件区,堆空间等等。而每个线程独享的包括栈空间,寄存器,程序计数器等。**引用书上的图来描述:
在这里插入图片描述
为什么要引入多线程的概念呢?那是因为多线程有他的一些特点:

  1. 多线程处理的响应度比较高。比如我们的网页,可以一边等待用户输入,另外一边装载图片进入页面。

  2. 多线程他的同一进程下的多个线程共享部分资源,这样子方便线程之间的通信(线程中的一种通信方式----共享内存)

  3. 线程速度快。线程的创建和管理,线程之间的切换要比进程的要快,简单。

  4. 多线程更能够充分利用多核处理器,使得运行速度变快,增加了并发性。

    线程呢又分为有用户线程和内核线程。用户线程受内核支持。用户线程和内核线程之间分为三种关系:

  • 多*(用户线程)对一(内核线程)*模型;特点是运行效率高,但是缺点是,当一个线程阻塞的话,整个进程会被阻塞。
  • 一对一模型;一个用户线程对应一个内核线程,这样子一个线程阻塞,其他线程可继续运行,提高了并行性,缺点是内核线程开销大,限制了系统所支持的线程数。
  • 多对多模型;多个用户线程对应在多个内核线程上面。它既可以开多个用户线程,而且一个线程阻塞也不影响其他线程的执行。

接下来我就使用多线程来计算一下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--------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值