创建一个简单的线程

HANDLE CreateThread(

           _In_opt_
LPSECURITY_ATTRIBUTES lpThreadAttributes,

           
//SECURITY_ATTRIBUTES结构指定了这个线程的安全属性,如果填NULL则就以默认的安全描述子创建,并且返回的句柄不会被继承。

 

            _In_SIZE_T dwStackSize,

           
//线程的堆栈大小(单位是字节),如果为0则默认和主线程一样大。堆栈再进程的内存空间内自动分配并在进程结束时释放。如有必要堆栈大小可以增加。

           
//CreateThread在试图分配大小为dwAtackSize字节数的内存,并在可用内存不足时返回失败消息。

  

            _In_LPTHREAD_START_ROUTINE lpStartAddress,

            //指向线程所需要执行的应用程序提供的函数,同时这也代表线程开始的地址。函数接受一个32位的参数并返回一个32位值

 

           _In_opt_ __drv_aliasesMem LPVOID lpParameter,

           
//指定一个传递给线程的32位参数值

 

            _In_DWORD dwCreationFlags,

           
//指定一个附加标志来控制线程的创建。如果CREATE_SUSPENDED标志被定义,线程就以挂起状态创建,即直到ResumeThread()函数被调用之前都不执行

           
//如果该值为0,线程在创建后立即开始执行

 

           _Out_opt_ LPDWORD lpThreadId

           
//指向一个保存线程的ID,32位变量

            )

         

如果执行成功,其返回值是指向下一个新线程的句柄。如果失败,将返回NULL。

当执行完一个线程后,应该关闭该线程的句柄。CloseHandle(),该函数使用CreateThread()返回点句柄,并将对应内核对象的引用计数器加减1。

这并不是强制关闭一个线程,而是告诉系统改线程处于结束时运行状态。

BOOL CloseHandle( _In_ HANDLE hObject )成功返回true,否者false

 

测试代码1当线程循环的次数小于主线程次数时

 

#include <windows.h>
#include <iostream>
using namespace std;

DWORD WINAPI Print_Thread(LPVOID data)
{
cout<<"开始线程\n";
    for(int index=0;index<25; index++)//循环25次
    {
       cout<<"Thread_"<<(int)data<<"_"<<index<<"\n";
        Sleep(100);
    }

    cout<<"Print_Thread线程执行完毕\n";
    return (DWORD)data;
}

int main()
{
    HANDLE threadHandle;//声明一个句柄
    DWORD  threadID;//线程ID

   threadHandle=CreateThread(
        NULL,
        0,
       Print_Thread,
        (LPVOID)1,
        0,
       &threadID
        );

    for (int index=0;index<50; index++)//循环50次
    {
       cout<<"Start_2_"<<index<<"\n";
        Sleep(100);
    }

   CloseHandle(threadHandle);

    system("pause");
    return 0;
}

测试代码2当线程循环的次数大于主线程次数时
#include <windows.h>
#include <iostream>
using namespace std

DWORD WINAPI Print_Thread(LPVOID data)
{
cout<<"开始线程\n";
    for(int index=0; index<50;index++)//循环50次
    {
       cout<<"Thread_"<<(int)data<<"_"<<index<<"\n";
        Sleep(100);
    }

    cout<<"Print_Thread线程执行完毕\n";
    return (DWORD)data;
}

int main()
{
    HANDLE threadHandle;//声明一个句柄
    DWORD  threadID;//线程ID

   threadHandle=CreateThread(
        NULL,
        0,
       Print_Thread,
        (LPVOID)1,
        0,
       &threadID
        );

    for (int index=0; index<25;index++)//循环25次
    {
       cout<<"Start_2_"<<index<<"\n";
        Sleep(100);
    }

   CloseHandle(threadHandle);

    system("pause");
    return 0;
}

只看看代码1可能没有什么特别的发现,所以我写了代码2与其进行对比。细心的读者会发现我只是改了主线程和子线程for循环的次数。

对比两个代码你会发现,当主线程结束时,子线程还在继续,由于我加了system("pause");所以第一个主线程的for循环结束后,程序没有直接退出,然而我们才能看到子线程还在继续跑直到结束才停止。如果你将system("pause");你会发现,当主线程执行完后程序直接退出,不会等待子线程结束。

时间: 2024-11-13 08:07:29

创建一个简单的线程的相关文章

如何利用CEF3创建一个简单的应用程序 (Windows Platform)

1. 说明 这篇文章主要讲述如何利用CEF3来创建一个简单的应用程序,引用的是1535及以上版本中包含的 Cefsimple 项目例子.如果想知道关于CEF3更多的使用方法,可以去访问 GeneralUsage. 2. 开始 首先,根据自身所使用的开发平台,可以去 这里 下载对应的发布版本.针对这个教程,我们需要下载1750或者更新的版本.当前支持的平台有Windows, Linux和Mac OS X.每一个版本都包含了当在特定平台上编译特定版本CEF3时所需要的所有文件和资源.您可以通过包含在

一个简单的线程锁------pthread和win32的临界区(Critical Section)

临界区: 临界区是指一个小代码段,在代码能够执行前,它必须独占对某些资源的访问权.这是让若干代码能够"以原子操作方式"来使用资源的一种方法. 所谓原子(atomic)操作方式,是指这段代码知道没有别的线程要访问这个资源. 说明: 1.  MacOSX,Windows有自己的线程模型, pthread可以说是跨平台的线程编程模型解决方案,当然对pthread不熟悉的也可以使用本地线程模型, 其实pthread的win32版本也是基于本地线程模型的, pthread-win32的mutex

java创建一个简单的小框架frame

import java.awt.*; import javax.swing.*; public class SimpleFrameTest { public static void main(String[] args) { EventQueue.invokeLater(new Runnable(){ // 开一个线程 public void run() { SimpleFrame frame = new SimpleFrame(); frame.setTitle("记事本"); //

IntelliJ IDEA 15 部署Tomcat及创建一个简单的Web工程

一.部署Tomcat 二.创建一个简单的Web工程 2.1创建一个新工程 创建一个新工程 设置JDK及选择Web Application (创建的是Web工程) 点击Next,选择工作空间,起个工程名 2.2项目部署 在工具栏点击 Project: 无需任何设置,选择默认编译目录(或自定义编译目录) Modules: 将Tomcat加入 Libraries:无需任何设置.这里描述了此项目的依赖. Facets: 无需任何设置.这里描述了此项目所适配的服务框架 Artifacts: 无需任何配置.

mysql 如何创建一个简单的存储过程

1 用mysql客户端登入2 选择数据库 mysql>use test3 查询当前数据库有哪些存储过程 mysql>show procedure status where Db='test'4 创建一个简单的存储过程 mysql>create procedure hi() select 'hello'; 5 存储过程创建完毕,看怎么调用它 mysql>call hi();显示结果 mysql> call hi(); +-------+ | hello | +-------+

《Entity Framework 6 Recipes》翻译系列 (3) -----第二章 实体数据建模基础之创建一个简单的模型 (转)

第二章 实体数据建模基础 很有可能,你才开始探索实体框架,你可能会问“我们怎么开始?”,如果你真是这样的话,那么本章就是一个很好的开始.如果不是,你已经建模,并在实体分裂和继承方面感觉良好,那么你可以跳过本章. 本章将带你漫游使用实体框架建模的基本实例,建模是实体框架的核心特性,同时也是区别实体框架和微软早期的数据访问平台的特性.一旦建好模,你就可以面向模型编写代码,而不用面向关系数据库中的行和列. 本章以创建一个简单概念模型的实例开始,然后让实体框架创建底层的数据库,剩下的实例,将向你展示,如

[安卓基础] 005.创建一个简单的UI

*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } a { color: #4183C4; text-decoration: none; } a.absent { color: #cc0000; } a.anchor { display: block; padding-left: 30px; margin-left: -30px; cursor: poin

SharePoint 创建一个简单的Web Part 部分

SharePoint 创建一个简单的Web Part 部分 标准Web零件有时会很强大,运行多个功能的能力. 本文介绍了如何使用Visual Studio 创建一个简单的Web部分. 1. 打开VS,点击文件----新建项目. 2. 选择空白SharePoint项目.命名SmallvilleWebPartProject,点击确定.选择部署为场解决方式. 3. 右击项目加入新项目. 4. 选择Web部件. 5. 命名CustomerInformation,点击加入. 6. 右击新的Web部件项目.

Highcharts创建一个简单的柱状图

新建一个html文件,将highcharts引入到你的页面后,通过两个步骤我们就可以创建一个简单的图表了. 1.创建div容器 在页面的 body部分创建一个div,并指定div 的 id,高度和宽度,代码如下 <div id="container" style="min-width:800px;height:400px"></div> 2.编写Highcharts代码 编写Highcharts必须的代码,用<script><