C运行环境库创建线程的方法
_beginthreadex 也能够创建线程
包含头文件process.h
函数原型
unsigned long _beginthreadex(
void *security, //指向 SECURITY_ATTRIBUTES 结构的指针
unsigned stack_size, //新线程的堆栈大小或 0
unsigned ( __stdcall *start_address )( void * ), //开始执行新线程的例程的起始地址
void *arglist, //要传递到新线程的参数或 NULL。
unsigned initflag, //控制新线程的初始状态的标志。 将 initflag 设置为 0 以立即运行
unsigned *thrdaddr //指向接收线程标识符的 32 位变量。 如果此变量为 NULL,则不可用。
);
CreateThread与_beginthreadex区别
下面是一些一般性的规则。如果主线程以外的任何线程进行以下操作,你就应该使用多线程版的 C runtime library ,并使用_beginthreadex() 和 _endthreadex():
- 在C 程序中使用 malloc() 和 free() ,或是在 C++ 程序中使用 new 和 delete 。
- 调用 stdio.h 或 io.h 中声明的任何函数,包括像 fopen() 、open() 、
- getchar() 、write() 、printf() 等等。所有这些函数都用到共享的数据结构以及errno。你可以使用 wsprintf() 将字符串格式化,如此就不需要 stdio.h 了。如果链接器抱怨说它找不到 wsprintf() ,你得链接 USER32.LIB 。
- 使用浮点变量或浮点运算函数。
- 调用任何一个使用了静态缓冲区的 runtime函数,如asctime() 、strtok() 或 rand() 。
一个程序如果使用多个线程,而不在任何 worker 线程中调用runtime library ,能够与单线程版的 runtime library 链接并以 CreateThread() 取代 _beginthreadex() 。
#include <windows.h>
#include <process.h>
#include <iostream>
using namespace std;
unsigned __stdcall ThreadProc(void* lpParameter)
{
cout<<"GetCurrentThreadId()="<<GetCurrentThreadId()<<endl;
int n = (int)lpParameter;
while (n--)
{
cout<<"this is a test"<<endl;
Sleep(1000);
}
return 100;
}
int main()
{
unsigned threadId;
HANDLE hThread = (HANDLE)_beginthreadex(NULL, 0, ThreadProc, (void*)5, 0, &threadId);
if (hThread == NULL)
{
cout<<"error with code"<<GetLastError()<<endl;
exit(1);
}
cout<<"threadId="<<threadId<<endl;
DWORD ret;
ret = WaitForSingleObject(hThread, INFINITE);
if (ret == WAIT_FAILED)
{
cout<<"error with code="<<GetLastError()<<endl;
exit(1);
}
else if (ret == WAIT_OBJECT_0)
{
cout<<"wait succ"<<endl;
}
//Sleep(10*1000);
CloseHandle(hThread);
return 0;
}
线程的封装
#ifndef _JTHREAD_H_
#define _JTHREAD_H_
#include <Windows.h>
class JThread
{
public:
JThread();
virtual ~JThread();
virtual void Run() = 0; //运行函数为纯虚函数
static unsigned __stdcall ThreadFun(void* p); //线程函数
bool Start(); //启动
void Wait(DWORD timeout = INFINITE); //阻塞
private:
HANDLE hThread_;
unsigned threadId_;
};
#endif // _JTHREAD_H_
#include "JThread.h"
#include <process.h>
JThread::JThread() : hThread_(NULL), threadId_(0)
{
}
JThread::~JThread()
{
if (hThread_ != NULL)
CloseHandle(hThread_);
}
unsigned __stdcall JThread::ThreadFun(void* p)
{
JThread* jtp = (JThread*)p; //基类指针指向派生类
jtp->Run(); //动态绑定
return 0;
}
bool JThread::Start()
{
hThread_ = (HANDLE)_beginthreadex(NULL, 0, ThreadFun, this, 0, &threadId_); //this作为ThreadFun的参数
return hThread_ != NULL;
}
void JThread::Wait(DWORD timeout)
{
WaitForSingleObject(hThread_, timeout);
}
#include "JThread.h"
#include <iostream>
using namespace std;
class TestThread : public JThread
{
public:
TestThread(int n) : n_(n)
{
}
~TestThread()
{
}
void Run() //覆盖Run函数
{
while (n_--)
{
cout << "this is a test" << endl;
Sleep(1000);
}
}
private:
int n_;
};
int main()
{
TestThread t(5);
t.Start();
t.Wait();
return 0;
}