线程
线程总是在进程里面被创建,线程的生命周期会受到进程的影响
进程一旦被创建,系统必然给出一个主线程
进程一旦死亡,这个进程里面的所有线程都会死亡
尽量通过创建线程的方式来解决问题
多线程使用的情况:如果同时有多个任务需要执行,这个多个任务会相互影响,那么通过多线程的方式来解决
多线程的创建:
多线程的通讯:
线程之间的通讯有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;
}