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

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