windows多线程

线程

线程总是在进程里面被创建,线程的生命周期会受到进程的影响
进程一旦被创建,系统必然给出一个主线程
进程一旦死亡,这个进程里面的所有线程都会死亡
尽量通过创建线程的方式来解决问题

多线程使用的情况:如果同时有多个任务需要执行,这个多个任务会相互影响,那么通过多线程的方式来解决

多线程的创建:
多线程的通讯:
线程之间的通讯有2种情况需要进行通讯:
1、如果有多个线程同时访问共享资源,而不能让共享资源被破坏
2、当一个线程完成某一个任务时,通知另一个线程去执行下一个任务

线程的互斥访问
内核对象也可以做互斥访问(事件,互斥,信号量)
通过使用临界区来完成进程同步。

// ConsoleApplication2.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <stdio.h>
#include<windows.h>
//1、临界区的变量定义
CRITICAL_SECTION g_cs = {};

int piao = 2000;//票数

void aaa(LPVOID v)//线程函数
{
	while (true)
	{
		//第3步,进入临界区
		EnterCriticalSection(&g_cs);
		if (piao > 0)
		{
			printf("第%d个代售点卖出第%d张票\n", (int)v, piao);
			piao--;
		}
		else
		{
			//第4步,离开临界区
			LeaveCriticalSection(&g_cs);
			break;
		}
		//第4步,离开临界区
		LeaveCriticalSection(&g_cs);
	}
}


int main()
{	//2、临界区变量的初始化
	InitializeCriticalSection(&g_cs);

	int index = 1;
	HANDLE hThread, hThread1, hThread2, hThread3,hThread4;
	hThread = CreateThread(nullptr,//指向了某一个结构的指针
		0,//线程堆栈大小,默认给0
		(LPTHREAD_START_ROUTINE)aaa,//线程的执行序列(线程函数)
		(LPVOID)index,//传递给该线程的参数(表示给参数3所表示的函数传的参)
		0,//线程创建的参数
		nullptr);//新线程的id

	index++;
	hThread1 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)aaa, (LPVOID)index, 0, nullptr);
	index++;
	hThread2 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)aaa, (LPVOID)index, 0, nullptr);
	index++;
	hThread3 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)aaa, (LPVOID)index, 0, nullptr);

	index++;
	hThread4 = CreateThread(nullptr, 0, (LPTHREAD_START_ROUTINE)aaa, (LPVOID)index, 0, nullptr);
	::WaitForSingleObject(hThread, INFINITE);

	::WaitForSingleObject(hThread1, INFINITE);  //使创建子进程全部受信。
	::WaitForSingleObject(hThread2, INFINITE);
	::WaitForSingleObject(hThread3, INFINITE);
	::WaitForSingleObject(hThread4, INFINITE);
	
	//第5步,释放临界区
	DeleteCriticalSection(&g_cs);


	//第二种通讯
	DWORD t1, t2, t3, t4;
	while (true)
	{
		//得到线程的退出码
		GetExitCodeThread(hThread, &t1);
		GetExitCodeThread(hThread1, &t2);
		GetExitCodeThread(hThread2, &t3);
		GetExitCodeThread(hThread3, &t4);
		//如果线程的退出码不是STILL_ACTIVE(依然激活),表示线程结束
		if (t1 != STILL_ACTIVE && t2 != STILL_ACTIVE && t3 != STILL_ACTIVE && t4 != STILL_ACTIVE)
			break;
	}

	/*
	while (true)
	{
		GetExitCodeThread(a线程,&退出码);
		if (退出码 ! = STILL_ACTIVE)
			CreateThread();//创建b线程
	}
	*/

	//结束子线程
	//TerminateThread(hThread, 0);
	//TerminateThread(hThread1, 0);
	//TerminateThread(hThread2, 0);
	//TerminateThread(hThread3, 0);
	return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风赤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值