c++ - 在 DPC 中使用唯一锁

标签 c++ multithreading kernel locking ndis

目前正在研究 NDIS 堆栈中的轻量级过滤器。我正在尝试注入(inject)一个在全局变量中设置为 NBL 的数据包。在接收 NBL 期间,如果注入(inject)的 NBL 处于未决状态,则线程会在提取注入(inject)的 NBL 以处理它之前获取锁。最初我正在考虑使用自旋锁或 FAST_MUTEX。但是根据 FAST_MUTEX 的文档,任何其他试图获取锁的线程都将等待锁释放后再继续。

问题是,接收 NBL 是在 DPC 模式下运行的。这将导致 DPC 运行线程暂停并等待锁释放。此外,我希望能够断言线程对锁的所有权。

我的问题是,Windows 内核是否支持内核中唯一的互斥锁,这些锁是否可以在 DPC 模式下使用,以及锁中所有权的断言有多昂贵。我对 C++ 还很陌生,所以请原谅任何语法错误。

我试图在 LWF 对象中定义一个互斥锁

// Header file

#pragma once
#include <mutex.h>

class LWFobject
{
public:
  LWFobject()
  std::mutex ExampleMutex;
  std::unique_lock ExampleLock;
}

//=============================================
// CPP file
#include "LWFobject.h"

LWFobject::LWFObject()
{
  ExmapleMutex = CreateMutex( 
        NULL,
        FALSE,    
        NULL); 
  ExampleLock(ExampleMutex, std::defer_lock);
}

内核是否支持使用 unique_locks?当我尝试编译它时,它会在尝试使用 mutex.h 时引发数百个编译错误。我想使用 try_lockowns_lock .

最佳答案

在 Windows 内核中不能使用标准 ISO C++ 同步机制。

Windows 内核本身就是一个完全不同的世界,它要求你遵守它的规则(这些规则非常庞大——例如,参见这两本 700 页的书:12)。

Windows 内核中的处理主要是异步的和基于事件的;您处理事件并安排延迟调用或使用其他 synchronization techniques 来完成以后需要完成的工作。

话虽如此,在 Windows 驱动程序中可以有传统意义上的互斥锁。它被称为 Fast Mutex 并且需要将 IRQL 提升到 APC_LEVEL。然后,您可以使用 ExAcquireFastMutexExTryToAcquireFastMutexExReleaseFastMutex 之类的调用来锁定/尝试锁定/释放它。

关于c++ - 在 DPC 中使用唯一锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59584649/

相关文章:

multithreading - 与用户空间上下文切换相比,内核上下文切换的代价有多大?

c++ - Linux Standard Base (LSB) AppChecker 可靠吗?

c++ - 确保 vector 中的共享指针被正确推回

c# - volatile 应该与(非并发)集合一起使用吗?

multithreading - x86 CPU 有多少条内存屏障指令?

android - Android内核编译错误

c++ - Complex类的成员函数设计问题

C++:如何从封闭类继承

multithreading - 在 Rust 中的线程之间共享字符串

linux - 有没有办法找出使用 Linux 内核模块的内容?