Windows多线程

程序和进程

**程序:**计算机指令的集合,以文件形式存储在磁盘上。
**进程:**一个正在运行的程序的实例,是程序在其自身的地址空间中的一次执行活动。多次执行,代表多个进程。

**进程的组成:**内核对象和地址空间。内核对象是系统用来存放关于进程 统计 信息的地方,是一个内存块,由操作系统分配,是一种数据结构,简单说负责维护进程。地址空间包含所有可执行的模块和DLL模块的代码和数据,包含动态分配的内存空间。

线程

真正完成代码执行的是线程,进程是线程运行的环境,或者说是线程的容器。

线程的组成:
**内核对象,**维护线程。
**线程栈,**维护线程执行过程中所有函数参数和局部变量。

**线程的运行:**宏观上看好像是同时运行,微观上系统为每个线程分配一个时间片。在 多CPU的机器上,可以实现线程真正的同时执行。

Windows 创建线程的函数CreateThread,其原型:

HANDLE CreateTreah
(
LPSECURITY_ATTRIIBUTES lpThread,//安全属性,默认NULL
DWORD dwStackSize,//线程栈大小KB
LPTHREAD_START_ROUTINE lpStartAddress,//线程函数起始地址
LPVOID  lpParameter,//命令行参数
DWORD dwCreateionFlags,//创建标志(是否创建后运行)
LPDWORD lpThreadId//线程ID;

单线程例子:

#include<Windows.h>
#include<iostream>
using namespace std;
DWORD WINAPI Fun1Proc(LPVOID lpParameter);
int index = 0;
void main()
{
	HANDLE hTread1;
	hTread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	CloseHandle(hTread1);

	cout << "Main thread runing\n";
	Sleep(10);
};
DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	cout << "Thread1 is running\n";
	return 0;
}

**互斥量:**对于多线程,使用一个资源,该将资源声明为互斥量。互斥量由一个线程占用资源,只有将资源释放后,才能由其他进程使用。
多线程例子(火车站卖票,两个线程一起卖票):

#include<windows.h>
#include<iostream>
using namespace std;

DWORD WINAPI Fun1Proc(LPVOID lpParameter);
DWORD WINAPI Fun2Proc(LPVOID lpParameter);

int index = 0;
int tickets = 1000;
HANDLE hMutex;
void  main()
{
	HANDLE hTread1;
	HANDLE hTread2;
	hTread1 = CreateThread(NULL, 0, Fun1Proc, NULL, 0, NULL);
	hTread2 = CreateThread(NULL, 0, Fun2Proc, NULL, 0, NULL);
	CloseHandle(hTread1);
	CloseHandle(hTread2);

	hMutex = CreateMutex(NULL, FALSE, NULL);

	Sleep(4000);
}

DWORD WINAPI Fun1Proc(LPVOID lpParameter)
{
	
	while (TRUE)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (tickets > 0)
		{
			cout << "1 sell ticket:" << tickets-- << endl;
		}
			
		else
			break;
		ReleaseMutex(hMutex);		
	}
	
	return 0;
}

DWORD WINAPI Fun2Proc(LPVOID lpParameter)
{
	
	while (TRUE)
	{
		WaitForSingleObject(hMutex, INFINITE);
		if (tickets > 0)
		{
			cout << "2 sell ticket:" << tickets-- << endl;
		}

		else
			break;
		ReleaseMutex(hMutex);
	}
	return 0;
}

注意:DWORD其实就是 unsigned long int 类型,HANDLE其实就是 void* 。WINAPI 其实就是_stdcall。无非是换个名称而已。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

林多

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

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

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

打赏作者

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

抵扣说明:

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

余额充值