Нужна ли синхронизация при одновременном использовании обработчика файла драйвера char в потоках? - PullRequest
0 голосов
/ 25 октября 2018

Я пишу библиотеку / 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 для выполнения вызовов read / write / ioctl на устройство в основном процессе.Эти вызовы никогда не должны переходить в спящий режим.
  • Он также необходим в функции потока для выполнения вызовов ioctl.

Вопросы:

  • Нужен ли механизм синхронизации для m_dev_handle?Синхронизация выполняется в коде драйвера для обработки вызовов чтения / записи / IOCTL.
  • Должна ли функция потока быть методом класса?

Чтобы знать:

  • Новая нить спит большую часть времени.Водитель усыпляет нить.Он просыпается только тогда, когда водитель получает прерывание.
...