多线程原理
lionelmessiCODE
努力进步
展开
-
多线程学习1
因为项目需要学习多线程,从最基本的概念学起: 进程:就是正在运行的应用程序;抽象的讲,进程是一些所有权的集合,拥有自己的内存、CPU运行时间等一系列资源,为线程运行提供必要环境。每个进程都有自己的地址空间和动态分配的内存以及文件、线程和其他一些模块。进程是正在运行程序的抽象。一个进程的状态有如下几种: 1.运行 2.就绪(当前能够运行但由于系统正在运行其他进程而需要等待) 3.堵塞(由于得不转载 2016-12-01 16:15:22 · 245 阅读 · 0 评论 -
事件
1.定义:简单地说,事件是主要在线程之间传递信号,通过事件来控制一个线程是处于执行状态还是处于挂起状态;事件和互斥量还是有所区别的: 1.事件主要是用于协调两个或多个线程之间的动作,如:一个线程等待某个事件的发生,另一个事件则在某个事件发生后产生一个信号,通知正在等待的线程。而互斥量主要是保证在任一时刻只有一个线程在使用共享的资源,什么时刻运行哪个线程是随机的,是由操作系统决定的,用户没有决定权,转载 2016-12-04 12:44:14 · 519 阅读 · 0 评论 -
临界段
临界段只能用于一个进程中不同线程的通信; 与互斥量的不同体现在两点上: 1.互斥量是内核变量,所以可以跨进程使用,当必须在进程间使用时,需要用互斥量;临界段不是互斥变量,他是属于进程内部的,对于进程间的通信无力; 2.临界段用于进程间不同线程的通信效率更高,首选临界段; IntializeCriticalSection():创建一个临界段; DeleteCriticalSection(转载 2016-12-04 10:09:42 · 1262 阅读 · 0 评论 -
多进程间的互斥对象通信
代码程序进程1:#include<iostream> #include <Windows.h> #include <process.h>//使用进程 using namespace std;HANDLE hMutex;//定义一个句柄给互斥对象使用 DWORD WINAPI Mythread(LPVOID lp1) { char ct1; WaitForSingleObject(hMut转载 2016-12-03 20:57:14 · 376 阅读 · 0 评论 -
互斥及其应用
互斥量和临界段的区别在于:临界段只能用于单个进程中的多个线程的同步,互斥量则可用于多个进程中线程的同步;一个有效的同步算法满足如下: 1.不存在两个线程同时访问临界区的情况; 2.同步方法对CPU速度和处理器数目没有任何假设; 3.运行于临界区外的线程不能阻塞其他线程; 4.不能有因要进入临界区而无限等待的线程;.互斥的同步机制:当一个线程获得互斥量后,其他所有要获取同一互斥量的线程都处于阻转载 2016-12-03 20:05:04 · 439 阅读 · 0 评论 -
线程间通信
1.线程间的通信主要涉及4个问题: 1)线程间如何传递信息; 2)线程之间如何同步,以使一个线程的活动不会破坏另一个线程的活动,以保证计算结果的正确性; 3)当线程之间存在依赖关系,如何调度线程的处理顺序; 4)如何避免死锁;四种方法主要为: 1.全局变量法; 2.参数传递法; 3.消息传递法; 4.线程同步法;全局变量法: 线程函数既可以是全局函数也可以是类中静态函数;参数传递法转载 2016-12-02 22:53:19 · 188 阅读 · 0 评论 -
_beginthread和_beginthreadex()
对应的还有:endthread()和endthreadex()都是用来创建线程的创建和结束的;区别在于 1.形式上看,_beginthreadex()更像CreateThread()._beginthreadex()比_beginthread()多了3个参数; 2.创建线程函数不同:_beginthreadex()的线程函数必须使用——Stdcall调用方式,而且必须返回一个unsigned i转载 2016-12-02 17:55:16 · 1001 阅读 · 0 评论 -
ExitThread
ExitThread调用后就会释放系统分配的堆栈,结束线程,如果线程是进程中最后一个,则会终止进程; 终止一个线程并不意味着从操作系统删除线程对象,操作系统只是在关闭与此线程关联的句柄将线程对象引用计数减一,当线程对象的引用计数为0才删除线程对象; SetThreadPriority():设置线程的优先级,有两个参数,第一个是线程的句柄,第二个是想要设置的优先级数; GetThreadPrio转载 2016-12-02 17:44:53 · 3290 阅读 · 0 评论 -
CloseHandle
1.为啥要在创建Handle后立马关闭; 首先我们都是在创建线程赋给一个句柄,然后立马结束句柄; 这是为啥?1.线程和线程句柄不是一个东西,线程是在CPU上运行的,线程句柄是一个内核对象。我们可以通过句柄来操作线程;但是其生命周期不同。线程生命周期是从线程函数开始执行到return,而线程句柄的生命周期是从CreateThread到CloseHandle(); 2.内核对象都是系统资源,用了要转载 2016-12-02 17:14:34 · 217 阅读 · 0 评论 -
信号量
信号量和互斥量相同,不过互斥量每次只允许一个线程访问共享资源,而信号变量则是允许一个或多个线程同时存取共享资源。线程需要同步的原因:1.线程之间竞争共享的资源; 2.为完成某个任务而需要协作; 通过互斥可完成线程之间的公共资源竞争,事件完成协调;而信号量则将互斥和事件结合起来,同时解决了竞争和协作问题。 信号量两大核心操作是提高计数值和降低计数值。DOWN操作是检查信号量的计数值大于0,则线程转载 2016-12-04 15:24:12 · 239 阅读 · 0 评论