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任务表