Pthread

Pthread

share memory
只有很少的API
非常方便传递资料
难点:Synchronization 同步问题

Shared-memory Programming

1.一个共享的内存,can be accessed by all processes,更快更方便在这里插入图片描述
2.但是存在三个问题
在这里插入图片描述
3.Threads vs. Processes
在这里插入图片描述
5.在linux中,在creat threads时,如果我们不指定共享的内存,那么它同processes差别并不是很大(含义上)
在这里插入图片描述
性能比较
在这里插入图片描述
在同一天机器上运行时,通常使用pthreads方式,
在不同机器上时,MPI和pthreads可以搭配使用

Pthread

What is Pthread

P:即是Potable Operating System Interface
带有便携式(可移植)操作系统接口的线程在这里插入图片描述

PthreadCreation

1.指定该线程去执行对应func()
在这里插入图片描述
注意:返回的值 是一个pointer 指针,对应 Pthread_join()函数
在这里插入图片描述

PthreadJoining & Detaching

每一个thread可执行完全不一样的func()
类似于web service ,不断地有用户发送请求,web端每接收一个请求,就创建一个线程来与之对应,web主线程就不再管理新线程
在这里插入图片描述

Synchronization Problem & Tools

在这里插入图片描述

Pthread

Mutually exclusion Lock

在这里插入图片描述
在这里插入图片描述
1.mutex主要是这个datatype,实际是一个struct
2.首先需要init
3. init()之后可以被重复使用
4. 该mutex是一个globe varible (所有线程要共享一个lock才能实现互斥,所以是全局变量)
5. 可以创建多个mutex
6. 最终call destroy
重点:找到程序的critical section

在这里插入图片描述
实际问题:
两个threads
一个Producer:不断地产生资料
另一个Consumer:接受资料的人
通过share memory 的buffer来实现数据的传递

1.写的时候可能覆盖
2.读的时候不能读到空
确定Bounded-Buffer什么是空什么时候是满
1.确定空
2.确定满
在这里插入图片描述
in始终指向已写入数据的下一位,所以当buffer满时,in指向buffer 的开头,值为0
实现区分empty和full

使用buffer状态来作为lock
在这里插入图片描述
in只会被producer修改
out只会被consumer修改
就不会出现同步的问题

Condition Varibles(条件变量)

1.是一个变量
可以去call signe
当某一个condition发生时,可以通过signal信号,将其他在sleep的thread 叫醒
2.对应的function call
wait(A); A会被block
signal(); 只会wake up 一个线程
broadcast(); 叫醒所有线程
在这里插入图片描述3.细节,会进行释放lock的操作,以便signal进入该线程
在这里插入图片描述
4.Condition Variable使用规范
问题:cond 是全局变量吗?
wait(cond,mutex)是使谁等待?(本线程?)
解释:cond是一个全局变量,CV在critic section中运行,对同一个cond,不会出现多个线程调用cond使自己等待,所以,signal()只会给一个wait解除等待
在这里插入图片描述
在这里插入图片描述
5.Condition Variable的执行过程
1.action中 上锁
2.指定cond wait 并释放该锁
3.counter中 上锁(获得该锁) 进入该critical section
4.执行critical section, signal cond,直至执行完
5.counter中 解锁释放
6.action 获得该锁 进而执行critical section后续指令
7.解锁,释放
几个问题:
1.什么是mutex以及lock?
2.有什么特性?
3.在action中,wait语句已经释放了锁,那么如若其他线程在signal A之前调用了action ,这些线程是否能进入critical section,并开始等待,这里的 同步问题 是如何解决的?
4.wait语句已经将lock释放,在counter释放锁后,action又重新获得锁,再次释放,这里一共释放了三次,却只创建了两次?
说明mutex 互斥 lock 锁之间存在某种对应关系,这里的mutex是全局变量,均对应一个lock,wait释放后,counter才能进入,counter未释放前,依旧是锁定状态,只有等counter释放,action才能继续,action最后的释放有意义吗?
在这里插入图片描述

Thread Pools

1.先创建好我们需要的Thread,放在Thread Pools中
2.function pointer 包在一个Task structure中
在这里插入图片描述
在这里插入图片描述
1.整个pool是一个struct去描述资源
2.存在task queue任务表
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值