- 直接干货:
#include<iostream>
#include<windows.h>
int main()
{
while(1)
{
std::cout<<"main!"<<std::endl; //该程序无限打印 main!
Sleep(1000); //不要忘记包含头文件windows
}
std::cin.get();
}
- 下面我们在主程序的基础上创建一条线程
```cpp
/*
这段代码执行结果为无限制打印 main!
*/
#include<iostream>
#include<windows.h>
void function()
{
while(1)
{
std::cout<<"function!"<<std::endl;
Sleep(1000);
}
}
int main()
{
//再此处创建线程
auto funThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function, NULL, 0, NULL);//关于CreateThread的参数下面细讲。
CloseHandle(funThread);
if (!funThread)
{
std::cout << "funThread Create Failed" << std::endl;
}
while (1)
{
std::cout << "main!" << std::endl;
Sleep(1000); //不要忘记包含头文件windows
}
std::cin.get();
}
输出结果如下:说明我们线程已经跑起来了,但是效果并不怎么好。
- 怎么办?加锁!!!!!
#include<iostream>
#include<windows.h>
//在这声明一个全局的锁。
HANDLE g_Mutex = CreateMutex(NULL, false, NULL);
//使用void 函数名()此种线程声明方式时,lpStartAddress需要加入LPTHREAD_START_ROUTINE转换
void function()
{
while(1)
{
WaitForSingleObject(g_Mutex,INFINITE);
std::cout<<"function!"<<std::endl;
Sleep(1000);
ReleaseMutex(g_Mutex);
}
}
//下面是第二种不需要LPTHREAD_START_ROUTINE转换的声明方式
/*
DWORD WINAPI function(LPVOID lpParam)
{
while (1)
{
WaitForSingleObject(g_Mutex, INFINITE);
std::cout << "function!" << std::endl;
Sleep(1000);
ReleaseMutex(g_Mutex);
}
}
*/
int main()
{
//再此处创建线程,线程创建之后就开始运行。
auto funThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function, NULL, 0, NULL);//关于CreateThread的参数下面细讲。
if (!funThread) //线程创建失败的话,返回0,;此处用if可以判断有效性。
{
std::cout << "funThread Create Failed" << std::endl;
}
CloseHandle(funThread); //funThread是句柄资源,十分珍贵。可以理解为指向线程的指针。
//句柄若不关闭,则系统资源会被耗尽。它的释放与线程无关。只是在创建的时候需要让它指向所创建的线程。
while (1)
{
WaitForSingleObject(g_Mutex,INFINITE); //WindowsAPI的等待函数。第2 个参数是Windows中定义的(#define INFINITE 0xFFFFFFFF)
std::cout << "main!" << std::endl;
Sleep(1000); //不要忘记包含头文件windows
ReleaseMutex(g_Mutex); //ReleaseMutex是一种线性指令,具有释放线程拥有的互斥体的控制权。
}
std::cin.get();
}
打印结果如下:(很完整,很规律)
CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)function, NULL, 0, NULL)参数说明:
CreateThread(
_In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, //指向SECURITY_ATTRIBUTES型态的结构的指针
_In_ SIZE_T dwStackSize, //设置初始栈的大小
_In_ LPTHREAD_START_ROUTINE lpStartAddress, //指向线程函数的指针,在上面的程序中就是function
_In_opt_ __drv_aliasesMem LPVOID lpParameter, //向线程函数传递的参数,不传时NULL
_In_ DWORD dwCreationFlags, //线程标志。可以标志为挂起、立刻激活等。
_Out_opt_ LPDWORD lpThreadId //保存新线程的id
);