Я пишу часть кода C для Node.js и хочу отличить синхронные от асинхронных вызовов. Другими словами, я хочу определить, работает ли мой код в потоке отправки событий V8, вызванном из цикла основного события или вызван ли он из некоторого отдельного рабочего потока. В первом случае я мог сразу перезвонить JavaScript, а в последнем мне пришлось бы использовать более сложный асинхронный обратный вызов.Определить, является ли текущий поток основным потоком цикла событий libuv по умолчанию
libuv threading API предоставляет uv_thread_self
для идентификации текущей темы и uv_thread_equal
для сравнения тем для равенства. Поэтому мне нужно найти uv_thread_t
основного цикла событий.
Я запутался, как это возможно, чтобы иметь код, который не знает, что нить его пробежал. Любой обратный вызов будет запускаться в том же потоке, что и в очереди, и libuv не является потокобезопасным, так что вы не можете ставить очередь обратных вызовов из потока, который не является потоком цикла событий. –
Я работаю над функциями расширения libxslt (https://github.com/albanm/node-libxslt/issues/2). Поэтому я пишу C-код, который будет зарегистрирован в глобальной структуре данных библиотеки XSLT и который будет вызываться из XSLT-процессора, который, в свою очередь, может быть вызван синхронно или асинхронно. Моя лучшая ставка на данный момент заключается в сохранении результата из 'uv_thread_self' в момент регистрации функции, предполагая, что это всегда будет поток основного события цикла. Но мне все еще интересно, есть ли что-то более элегантное, чем это. – MvG