C ++ 11 thread_local и "чужие" потоки - PullRequest
0 голосов
/ 30 июня 2018

Я хотел бы использовать C ++ 11 thread_local, но наше приложение встраивает JVM, и иногда методы C ++ вызываются из потока, созданного Java, через JNI. По сути, это та же проблема, как если бы внешняя библиотека «C» создала поток и перезвонила в мой код C ++. Определяется ли поведение thread_local переменных в этих обстоятельствах? Есть ли способ, чтобы мой код компенсировал неожиданное появление постороннего потока? Как насчет уничтожения при выходе из потока?

РЕДАКТИРОВАТЬ: Факт, что C ++ вызывается из потока JVM через JNI, на самом деле не является центральной точкой. Любая чужая нить (не созданная std::thread или main()) будет иметь такую ​​же проблему, предположительно.

РЕДАКТИРОВАТЬ: JVM, которая меня интересует, это реализации OpenJDK (nee Oracle) x64 в Windows и Linux (Ubuntu и RedHat)

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вопрос сводится к реализации vm и реализации c ++ 11. Есть много комбинаций, а также это понятие чужой нити не очень хорошо определено в вашем вопросе. Если я могу охватить свой ответ иностранным значением pthread и vm, означающим android, тогда ответ - да. этот источник llvm для потока stdcxx использует pthreads для реализации потока. В вашем вопросе не указано, какая виртуальная машина вам интересна. Некоторые импровентации виртуальных машин Android (опять же, их много) используют pthread для многопоточности, вот немного устаревший пример, eclair

0 голосов
/ 15 января 2019

Если вы используете свой код в jni. Затем вы используете специальный компилятор для компиляции вашего кода на C ++.

Например, Android может вызывать функции C ++ на основе NDK. И есть специальный компилятор для компиляции кода C ++. Если код скомпилирован, то функция и реализация существуют в этом компиляторе.

Если внешняя библиотека "C" создала поток и перезвонила в мой код C ++. Реализация потока на моем сайте c ++ будет основана на Windows или Linux, на основе рабочей станции. Реализация будет вызывать определенный код Windows или Linux, чтобы получить то, что я хочу. Как fopen в c или std :: fstream open. Это вызовет реализацию, реализованную в компиляторе. В линуксе открой в виндовс какой-нибудь вызов winapi

Поэтому оно должно работать, если оно реализовано.

...