Моноблок может работать без создания потока?


Я хотел бы, чтобы aio сигнализировал моей программе, когда операция чтения завершается, и согласно этой странице, такое уведомление может быть получено либо сигналом, отправленным ядром, либо запуском потока, выполняющего пользовательскую функцию. Любое поведение можно выбрать, установив правильное значение sigev_notify.

Я попробовал и вскоре обнаружил, что даже при установке на получение уведомления по сигналу был создан другой поток.

(gdb) info threads
  Id   Target Id         Frame 
  2    Thread 0x7ffff7ff9700 (LWP 6347) "xnotify" 0x00007ffff7147e50 in gettimeofday () from /lib64/libc.so.6
* 1    Thread 0x7ffff7fc3720 (LWP 6344) "xnotify" 0x0000000000401834 in update (this=0x7fffffffdc00)

Док также утверждает, что: реализация этих функций может осуществляться с помощью поддержки в ядре (если таковая имеется) или с помощью реализации, основанной на потоках на уровне пользователя. Я хотел бы вообще не иметь ниточки, возможно ли это?

Я проверил свое ядро, и оно выглядит нормально:

qdii@localhost /home/qdii $ grep -i aio /usr/src/linux/.config
CONFIG_AIO=y

Можно ли запустить aio вообще без какого-либо (userland) потока (кроме основного, конечно)?

EDIT : Я зарылся в него еще глубже. librt, по-видимому, предоставляет коллекцию функций aio: просмотр источников glibc выявил кое-что подозрительное: inside / rt / aio_read.c-это заглушка функции:

int aio_read (struct aiocb *aiocbp)
{
  __set_errno (ENOSYS);
  return -1;
}

stub_warning (aio_read)
Я нашел первую соответствующую реализацию в подкаталоге sysdeps/pthread, который непосредственно вызвал __aio_enqueue_request(..., LIO_READ), что в свою очередь создало pthreads. Но поскольку я задавался вопросом, почему в этом случае будет stup, я подумал, что, возможно, stub может быть реализован самим ядром linux, и что реализация pthread будет своего рода резервным кодом.

Греппинг aio_read через мой каталог /usr/src / linux дает много результатов, которые я сейчас пытаюсь понять.

1   2   2012-02-26 01:51:10

1 ответ:

Я обнаружил, что на самом деле существуют две действительно разные библиотеки aio: одна является частью glibc, включенной в librt, и выполняет асинхронный доступ с помощью pthreads. Другая библиотека aio реализует тот же интерфейс, что и первая, но построена на самом ядре linux и может использовать сигналы для асинхронного запуска.