処理にネイティブ コードを使用する Java サーバー (Linux 64 ビット) アプリケーションがあります。ネイティブ コードは、すべてのマルチスレッドの問題も処理し、最近では を使用したファイバー スイッチングで強化されていboost::context
ます。
現在直面している問題はAttachCurrentThread
、ファイバー スイッチ スレッドでは失敗することです。長いデバッグおよびテスト セッションの後、この原因を突き止めました。JVM は、作成時に指定されたスタック ポインタとは異なるスタック ポインタを持つスレッドを拒否しているようです。
rsp
変更されたときに失敗する、変更された (ただし有効な) pthread から JVM にアタッチするだけで、これを検証しましたrsp
。
考えられる修正は、ファイバー交換スレッドからコールバックを分離するために何らかのイベント処理メカニズムを導入することですが、私は本当にそれを避けたいと思っています.
誰かがこれに対する回避策を知っていますか?
スタック チェックを無効にすることはできますか (Oracle Java 1.7.0_40、64 ビット)?
正しいスタック フレームを指すようにネイティブ pthread を変更できますか (できるとは思えません)。(事前にスタック フレームを設定することはできません)。