美文网首页
最简单的创建线程 -- VS2008

最简单的创建线程 -- VS2008

作者: 7bfedbe4863a | 来源:发表于2017-12-27 00:02 被阅读0次

头文件相关   

    _beginthread    process.h

    HANDLE          windows.h

线程创建相关

(1)用_beginthreadex创建线程:

    unsigned long _beginthreadex(void * security,unsigned stack_size,unsigned(__stdcall *start_address)(void*),void* arglist,unsigned initflag,unsigned * thrdaddr);

参数:1、安全属性,NULL表示默认安全属性

2、指定线程堆栈的大小。一般用0,0表示线程堆栈的大小和创建它的线程相同。

3、指定线程函数的地址,用函数名。线程函数一般不能为类的普通成员函数,可以是静态成员函数。

4、传递给线程的指针。用于线程函数

5、线程的初始状态。0表示立刻执行,CREATE_SUSPEND表示悬挂。

6、线程ID的地址。

(2)因为_beginthreadex和_endthreadex是CRT线程函数,所以必须注意编译选项runtimelibaray的选择,使用MT或MTD。[MultiThreaded , Debug MultiThreaded]。

(3)_beginthreadex是一个C运行时库的函数,CreateThread是一个系统API函 数,_beginthreadex内部调用了CreateThread。因为_beginthreadex在内部调用了CreateThread,在调用之前_beginthreadex做了很多的工作,从而使得它比CreateThread更安全。

线程返回相关:       

a)线程函数返回;(最佳选择)       

b)线程通过调用ExitThread函数“杀死”自己(尽量不用);杀死主线程         

调用_endthreadex销毁线程,不要用ExitThread           

VOID ExitThread(DWORD dwExitCode);        //参数表明将线程的退出代码设为什么(c/c++不要用,数据块不会被销毁,会导致内存泄露)

HANDLE和线程相关   

CloseHandel(ThreadHandle );只是关闭了一个线程句柄对象,表示不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。在确定之后不会再使用这个句柄的时候就可以close。   

句柄和线程的生命周期不同。



最简单的代码:


#include "stdafx.h"

#include <Windows.h>

#include <process.h>

#include <stdio.h>

#include <string>

using namespace std;

class ThreadX{

public:

ThreadX(int start,int end,int dis)

{

loopStart = start;

loopEnd = end;

dispFrequency = dis;

}

static unsigned __stdcall ThreadStaticEntryPoint(void* pThis)

{

ThreadX* pthx = (ThreadX*)pThis;

pthx->ThreadEntryPoint();

return 1;

}

void ThreadEntryPoint()

{

for(int i=loopStart;i<=loopEnd;++i)

{

if (i%dispFrequency == 0)

{

printf("%s:i = %d.\n",threadName.c_str(),i);

}

}

printf("%s thread terminating.\n",threadName.c_str());

}

string threadName;

private:

int loopStart;

int loopEnd;

int dispFrequency;

};

unsigned __stdcall ThreadFunction3(void* pThis)

{

int j = (int)pThis;

printf("This is thread_3.\n");

return 1;

}

int _tmain(int argc, _TCHAR* argv[])

{

HANDLE hMutex;

ThreadX* o1 = new ThreadX(0,1,2000);

HANDLE hth1;

unsigned uiThreadID1;

hth1 = (HANDLE)_beginthreadex(NULL,0,ThreadX::ThreadStaticEntryPoint,o1,CREATE_SUSPENDED,&uiThreadID1);

if (hth1 == NULL)

{

printf("Failed to create thread.\n");

}

DWORD dwExitCode;

GetExitCodeThread(hth1,&dwExitCode);

printf("initial thread_1 exit code = %u.\n",dwExitCode);

o1->threadName = "thread_2";

ThreadX* o2 = new ThreadX(0,1,2000);

HANDLE hth2;

unsigned uiThreadID2;

hth2 = (HANDLE)_beginthreadex(NULL,0,ThreadX::ThreadStaticEntryPoint,o2,CREATE_SUSPENDED,&uiThreadID2);

if (hth1 == NULL)

{

printf("Failed to create thread_2.\n");

}

GetExitCodeThread(hth2,&dwExitCode);

printf("initial thread_2 exit code = %u.\n",dwExitCode);

o2->threadName = "thread_2";

ResumeThread(hth1);

ResumeThread(hth2);

WaitForSingleObject(hth1,INFINITE);

WaitForSingleObject(hth2,INFINITE);

GetExitCodeThread(hth1,&dwExitCode);

printf("initial thread_1 exit code = %u.\n",dwExitCode);

GetExitCodeThread(hth2,&dwExitCode);

printf("initial thread_2 exit code = %u.\n",dwExitCode);

CloseHandle(hth1);

CloseHandle(hth2);

delete o1;

o1 = NULL;

delete o2;

o2 = NULL;

int j = 2;

HANDLE hth3;

unsigned uiThreadID3;

hth3 = (HANDLE)_beginthreadex(NULL,0,ThreadFunction3,(void*)j,CREATE_SUSPENDED,&uiThreadID3);

if (hth3 == NULL)

{

printf("Failed to create thread.\n");

}

GetExitCodeThread(hth2,&dwExitCode);

ResumeThread(hth3);

WaitForSingleObject(hth3,INFINITE);

CloseHandle(hth3);

printf("Primary thread terminating.\n");

return 0;

}


相关文章

  • 最简单的创建线程 -- VS2008

    头文件相关 _beginthread process.h HANDLE windows.h ...

  • Java线程学习

    Java创建一个线程,最简单的方法就是从Thread类继承。这个类包含了创建和运行线程所需的一切东西。Tread最...

  • Java 线程

    线程 java 创建线程最简单的方式就是继承 Thread 类或者实现 Runnable 接口实现 run(...

  • 多线程编程之NSThread

    NSThread创建线程很简单,管理线程很困难 一、创建线程 1、创建线程对象,调用start方法执行线程 NST...

  • 其他快速开启线程的方法

    创建线程后自动启动线程 隐式创建并启动线程 ● 上述2种创建线程方式的优缺点● 优点:简单快捷● 缺点:无法对线程...

  • 线程1:线程的创建和基本用法--java36(03/17/201

    线程的简单创建 线程的优先级 线程的方法

  • iOS 多线程开发

    一、NSThread 1、创建和启动线程 2、其他创建线程方式 上述2种创建线程方式的优缺点优点:简单快捷缺点:无...

  • 多线程 - NSThread

    创建和启动线程简单说明 1.创建,启动线程 1.1创建线程(3中方法) 方法1: 方法2: 方法3: 线程参数设置...

  • 线程执行工具类

    在Android中经常会用到多线程开发,最简单的做法是new一个Thread去执行,这种写法如果多的话,线程的创建...

  • iOS开发多线程--创建线程

    创建线程启动线程的简单说明 一个NSThread对象就代表一条线程创建、启动线程 主线程相关用法 其他用法获得当前...

网友评论

      本文标题:最简单的创建线程 -- VS2008

      本文链接:https://www.haomeiwen.com/subject/qbcygxtx.html