• QQ
  • nahooten@sina.com
  • 常州市九洲新世界花苑15-2

技术天地

C++多线程技术windows常用办法

原创内容,转载请注明原文网址:http://homeqin.cn/a/wenzhangboke/jishutiandi/2019/0713/573.html

随着计算机CPU计算才能快速进步,计算机的处置性能和并行性才能也大大提升。那么,一味运用运转时规范库的C++言语也应该开端支持多线程技术。今天,我为大家带来了C++在windows平台下的常用多线程办法。
 
首先我常州平台运营先说一下线程的状态。线程有挂起状态、执行状态、阻塞状态和等候状态,下面分别引见:挂起状态是说线程创立后并没有直接执行或是调用函数挂起了线程。被挂起了的线程没有执行的才能,只要调用启动函数了之后才干执行。而执行状态是指在线程的时间片内,具有CPU资源的时分,这是,线程便开端执行。阻塞状态是由于停止大量输入输出操作或发作执行错误时,线程失去执行状态,只要等候问题解除之后,线程才干进入等候状态。等候状态是指线程启动或时间片抢占失败是等候其他线程执行,在此期间,线程随时可能被执行。那么,请大家看一个流程图:
 
线程流程
 
由于C++不像Java一样需求停止跨平台优化,所以我们运用最简单的办法来完成多线程技术——windows.h中的CreateThread以及相关函数和类。首先,以如下的方式援用头文件:
 
#include <windows.h>
下面,我们常州软件技术培训来引见如何创立线程,我不会向普通的教程那样上来先罗列一大堆MSDN上的函数原型,把大家弄得浑浑噩噩了再讲,我首先先把函数原型翻译成中文好了:
 
复制代码
线程句柄 CreateThread(
                 线程平安性描绘(一个构造体,普通是NULL)LPSECURITY_ATTRIBUTES  lpThreadAttributes,
                 一种数值(栈深度,普通是0)DWORD  dwStackSize,
                 启动函数(普通状况如下论述) LPTHREAD_START_ROUTINE lpStartAddress,
                 附加参数(普通为NULL) LPVOID lpParameter,
                 运转参数(能否在创立完成后就启动线程,详细下面将)DWORD dwCreationFlags,
                 返回句柄(普通是0,或者是一个DWORD型变量的地址,别忘了&)LPDWORD lpThreadId);
复制代码
下面我就重点说一下:
 
//这第三个参数启动函数很重要:
 LPTHREAD_START_ROUTINE lpStartAddress
//我们普通这样写:
(LPTHREAD_START_ROUTINE) ThreadStart
//意义就是在线程启动的时分调用ThreadStart,之后他就不论了,也就是说这个函数就是线程主函数相当于main的意义。也就是说在这个函数中调用的类资源或函数资源都是属于这个线程的。除了static的存储类
还有我要说一下HANDLE这个类型,它其实是一个指针,也是CreateThread的返回值。也就是一个线程句柄,用于标示一个线程。当然,其他关于线程的操作都需求运用这个指针。假如你没有学过指针援用,还是好好温习一下*和&吧。对了还有->。我为什么要引见HANDLE呢?由于我将要说一下倒数第二个参数——运转参数。这是实践上是一个bool类型的值,用于标示能否在创立线程后立即执行,假如为true,也就是0,那么就会立即执行,否则将会挂起,等候启动。那么,我们用以下办法启动线程:
 
DWORD ResumeThread(HANDLE hThread); //启动线程
//阐明:DWORD是一个数值,代表句柄,无需关注;
//参数表示要启动的线程的句柄,也就是方才引见的由CreateThread返回的HANDLE
假如调用这个函数,将会启动HANDLE参数所代表的线程。下面我们看看如何挂起线程,使线程进入挂起状态:
 
DWORD SuspendThread(HANDLE hThread); //挂起线程
//阐明:DWORD是一个整数值,代表一个句柄,无需过火关注
//参数:一个HANDLE线程指针,由CreateThread创立
//功用:挂起线程直到运用ResumeThread
挂起线程后能够停止释放以便中止线程:
 
delete HANDLE //释放指针资源
//阐明:HANDLE是一个HANDLE型指针,代表企业培训释放一个线程的资源,使线程死亡
挂起线程也可能为了等候重要操作然后再执行线程,以下函数将解除线程挂起状态,使线程进入等候状态:
 
DWORD ResumeThread(HANDLE hThread); //使线程脱离挂起状态
//阐明:返回值也是句柄
//参数:HANDLE类型指针,表示要继续的线程,或刚创立而没有启动的线程
//留意:假如对等候状态下的线程运用本函数,可能会抛出异常或无效果,详细请见MSDN
实践上,中止一个线程还有一种办法——强行中止,但是曾经不倡议运用,如今都是运用挂起+delete的办法,由于运用强行中止会有很多的平安问题,但也是一个功用,所以在这里为大家引见一下:
 
BOOL TerminateThread(HANDLE hThread,DWORD dwExitCode); //强行中止线程
//阐明:返回值代表能否胜利
//参数:HANDLE指针代表需求完毕的线程,DWORD数值代表该线程的退出值
//功用:在任何位置完毕任何线程
那么,关于多线程的根本C++API就讲完了,那么我要说一个关键字——volatile。它代表“易变的”,编译器不会优化运用这个关键字生命的全局变量,保证此变量完整“听你的话”。那么,就能够完成简单的线程间通讯。接着,来写一个比拟简单的例程,原本是Java1234的多线程例程,如今被我改成了C++版本。请看:
 
复制代码
//多线程抢占输出
#include 
#include <windows.h>
using namespace std;
void ThreadUser(){ //常州网站开发培训线程入口
    cout<<"子线程开端"<<"\n";
     for(int i=0;i<100;++i){ //抢占循环
        cout<<"子线程第"<<i<<"次循环抢占;"<<"\n"; //输出信息
        Sleep(100); //抢占延时
    }
    cout<<"子线程完毕"<<"\n";
}
int main(){
    cout<<"主线程开端"<<"\n";
    HANDLE h; //线程句柄
    CreateThread(null,0,(LPTHREAD_START_ROUTINE)ThreadUser,null,1,0); //创立子线程
    ResumeThread(HANDLE);  //启动子线程
    for(int i=0;i<100;++i){ //抢占循环
        cout<<"主线程第"<<i<<"次循环抢占;"<<"\n"; //输出信息
        Sleep(100); //抢占延时
    }
    Sleep(1000); //等候子线程
    delete h; //回收子线程资源
    cout<<"主线程完毕"<<"\n";
    system("pause");
    return 0;
}
复制代码
好了,我们App开发培训的多线程就先讲到这里,下次再见。

上篇:上一篇:vs2008 R6034
下篇:下一篇:c++使用curl库访问服务器并获取应答结果