0

メッセージを出力するための pthread を作成する例を作成しました。しかし、出力は予想外です。

コード:

System.out.println("Before call native thread");
// invoke the native method to print a message
int socketId = new SocketJNI().createSocket(); //line 7
Thread.sleep(2000);
System.out.println("After call native thread");//line 9: create break point here

C コード:

JNIEXPORT jint JNICALL 
Java_SocketJNI_createSocket(JNIEnv * env, jobject obj)
{
    pthread_t thread;
    pthread_create(&thread, NULL, createSocket, NULL);
    return 0;
}

void* createSocket(void *arg) 
{
    printf("Inside native thread(pthread)");
    pthread_exit(NULL);
}

出力:

Before call native thread
After call native thread
Inside native thread(pthread)

しかし、私はそれがあるべきだと思います:

Before call native thread
Inside native thread(pthread)
After call native thread

それで、問題は何ですか?pthread はどのように機能しますか?

アップデート:

8 行目 (デバッグ時) に到達すると、pthread (7 行目で作成) はメッセージを出力しません。

Before call native thread

私は待って、待っても印刷しない 9行目以降:

Before call native thread
After call native thread
4

2 に答える 2

1

出力が送信されるとすぐにフラッシュされるようにするには、バッファリングをオフにするSystem.outか、 を使用しますSystem.err。ネイティブ側では、 のstderr代わりに (unbuffered) を使用しstdoutます。System.out.flush()Java およびC で を使用しfflush(stdout)て、バッファリングされたデータの出力を強制することもできます。

Java と C は出力ストリームに同じバッファーを使用せず、ターミナルに向かう途中で 2 つの出力が混在することを妨げるものは何もないため、予期しない結果が得られる可能性があることに注意してください。ただし、実際には、フラッシュするとすぐに (またはバッファリングされていない場合は出力されるとすぐに) 出力が表示される可能性があります。

スレッドが実際に実行されるのは、スレッドを作成した後です。明示的な同期を行わない限り、Java メソッドが戻ってからしばらく経つまで実行されない可能性があります。新しいスレッドを (Java の外部で) 開始するのはシステム次第であるため、システム負荷、メモリ スワッピングなど、さまざまな要因によってスレッドの開始が遅れる可能性があります。

于 2013-09-19T21:36:54.277 に答える