Nano Hash - криптовалюты, майнинг, программирование

Собственный поток с переключением контекста не может подключиться к JVM

У нас есть приложение Java-сервера (64-разрядная версия Linux), которое использует собственный код для обработки. Собственный код также обрабатывает все проблемы многопоточности и недавно был улучшен коммутацией волокон с использованием boost::context.

Проблема, с которой мы сталкиваемся прямо сейчас, заключается в том, что AttachCurrentThread не работает для потоков с коммутацией волокон. После нескольких долгих сеансов отладки и тестирования мы обнаружили причину этого: похоже, JVM отказывается от потоков с указателями стека, отличными от указанных при ее создании.

Мы проверили это, просто подключившись к JVM из потока pthread с измененным (но действительным) rsp, который не работает, когда rsp изменяется.

Возможное исправление могло бы ввести какой-то механизм обработки событий, чтобы отделить обратные вызовы от потоков с коммутацией волокон, но мне бы очень хотелось этого избежать.

Кто-нибудь знает обходной путь для этого?

Можно ли отключить проверку стека (Oracle Java 1.7.0_40, 64 бит)?

Можем ли мы изменить собственные потоки pthread, чтобы они указывали на правильные кадры стека (я сомневаюсь, что сможем)? (Мы не можем заранее установить кадры стека).


  • Я знаю, что это не совсем ответ на вашу проблему, но вы можете попробовать заменить свои волокна boost :: context (реализованные на C ++) реализацией некоторых волокон из мира Java. В этом контексте их часто называют сопрограммами. Некоторые существующие реализации здесь: Доступные библиотеки сопрограмм на Java 01.11.2015
  • Вы когда-нибудь находили решение этой проблемы? Я пытаюсь использовать Boost.Coroutine, и мне нужно позвонить обратно в пространство Java из JNI в такой процедуре, которая приводит к множеству сбоев ... 30.06.2016

Ответы:


1

ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: На самом деле это не ответ, потому что я не обращаюсь напрямую к проблеме переключения RSP, но это было слишком долго, чтобы помещать в комментарий.

По моему опыту, вы должны прикрепить собственный поток ровно один раз и отсоединить ровно один раз, прежде чем он завершится. Если вы не знаете, подключились ли вы уже, используйте этот код:

jint rv = vm->GetEnv((void**)&env, JNI_VERSION_1_6);
if (rv == JNI_EDETACHED) {
    vm->AttachCurrentThread((void**)&env, 0);
}

Я предлагаю сначала убедиться, что вы подключитесь к потоку ровно один раз, прежде чем будут созданы какие-либо связанные волокна, и отсоединитесь ровно один раз от каждого собственного потока перед его выходом (или не отключите вообще, если собственные потоки не завершаются).

01.03.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..