- 直接乾貨:
#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
);