c++ - 在线程中同时使用 char 驱动程序文件处理程序时是否需要同步?
问题描述
我正在编写一个库/API 来与我的设备驱动程序进行通信。
class pcie_dev
{
public:
pcie_dev(unsigned int bdf=0, int bar=-1);
~pcie_dev(void);
private:
ssize_t m_dev_handle; // device file
};
构造函数pcie_dev
打开设备文件并更新m_dev_handle
. 它还创建了一个新线程,该线程进行 IOCTL 调用,大部分时间都会休眠。
pcie_dev::pcie_dev(unsigned int bdf, int bar)
{
ssize_t fd;
fd = open(DEV_FILENAME, O_RDWR | O_CLOEXEC);
if (fd == -1) {
throw std::runtime_error("could not open character device");
}
m_dev_handle = fd;
[do some stuffs]
std::thread threadIrq(threadProcess, m_dev_handle);
};
新的线程函数不是方法,它是类外的静态函数,但在同一个文件中。
static void threadProcess(ssize_t m_dev_handle)
{
int result;
uint32_t subIrq;
while(1)
{
result = ioctl(m_dev_handle, PCIE_IOCTL_IRQ_PROCESS, (void*) NULL);
if (result == 0) {
printf("Process woke up\n");
}
}
}
- 我正在使用
m_dev_handle
在主进程中对设备进行读/写/ioctl 调用。这些呼叫不应该进入休眠状态。 - 我在线程函数中也需要它来进行 ioctl 调用。
问题:
- 我需要一个同步机制
m_dev_handle
吗?在驱动程序代码中进行同步以处理读/写/IOCTL 调用。 - 线程函数应该是类的方法吗?
要知道:
- 新线程大部分时间都在休眠。驱动程序让线程休眠。它仅在驱动程序收到中断时唤醒。
解决方案
推荐阅读
- ios - 调用协议方法会导致崩溃
- android - 如何解决recyclerv视图列表更新延迟
- c# - 如何使用 DirectoryEntry 更新 Active Directory 中的数据?
- laravel - Laravel Eloquent 获取可能存在或不存在的嵌套急切加载的属性
- reactjs - npm start 在浏览器中显示生成的 js 文件
- visual-studio - Which key is the up arrow shortcut in Visual Studio code for OSX?
- php - 总是 MySQL 什么也不输出。告诉我为什么?
- javascript - 如果所有子类别复选框均已选中,则应自动选中父复选框
- javascript - 使用 Javascript 将两个变量连接成一个新变量
- java - 在“for 语句”中打印出数组