C++多線程編程,最簡單,最直接,最好學。

  • 直接乾貨:

#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
    );

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章