1.内核级临界资源怎么办?
之前我们的临界资源是一个全局变量,它是在同一个进程中由两个或者多个线程共享的,可是如果我们把临界资源放到内核中想要实现跨进程的共享怎么办呢?我们之前实现临界区的时候哪个进程拿到令牌哪个进程就使用临界资源。那么是不是在内核中也类似令牌的东西?
2.互斥体的使用
我们可以把互斥体看作是内核中的令牌。
如图所示:
原理:当X线程访问临界资源时会先判断能否访问如果可以访问(得到令牌)那么就可以使用临界资源,这时Y线程判断是否可以访问,肯定是不行的那么Y线程就等待X线程归还令牌。
原理其实与之前的差不多,只不过把令牌放到了内核层中,因为我们知道内核层是共用的,这样才能实现不同进程访问临界资源。
创建互斥体:CreateMutexA():
HANDLE CreateMutexA(
[in, optional] LPSECURITY_ATTRIBUTES lpMutexAttributes,//安全描述符
[in] BOOL bInitialOwner,//创建互斥体时有没有信号FALSE有TRUE没有
[in, optional] LPCSTR lpName//内核互斥体的名字(随便起)
);
ok下面我们使用互斥体创建临界区
示例代码:
#include"stdafx.h"
#include<stdio.h>
int main(int argc, char* argv[])
{
//创建互斥体
HANDLE hMutex = CreateMutexA(NULL, FALSE, "wzp");
//获取令牌
WaitForSingleObject(hMutex, INFINITE);
for (int i = 0; i < 10; i++)
{
Sleep(1000);
printf("B进程的Y线程:%d \n", i);
}
//释放令牌
ReleaseMutex(hMutex);
return 0;
}
我们把这个代码放到两个不同的进程中看看效果
输出:我们们先运行exam。在运行Pr