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 和fflush(stdout)C 中使用强制输出任何缓冲数据。

请注意,您仍然可能会得到一些意想不到的结果,因为 Java 和 C 不会对输出流使用相同的缓冲区,并且没有什么可以阻止两个输出在到达终端的途中混合。但是,在实践中,您可能会在刷新输出后立即看到输出(或者,如果没有缓冲,则在输出时立即看到)。

至于你的线程何时真正运行,它会你创建它之后的某个时间。除非您进行一些显式同步,否则它可能要等到您的 Java 方法返回很久之后才会运行。启动新线程(在 Java 之外)取决于系统,因此任何数量的因素都可能会延迟线程的启动,包括系统负载、内存交换等。

于 2013-09-19T21:36:54.277 回答
1

Thread.sleep(2000) 不是您应该同步线程的方式。如果您希望父线程等待子线程,则父线程应该加入子线程。这是您应该使用的 createSocket。

Java_SocketJNI_createSocket(JNIEnv * env, jobject obj)
{
   pthread_t thread;
   pthread_create(&thread, NULL, createSocket, NULL);
   pthread_join(thread,NULL); 
   return 0;
}
于 2013-09-19T06:20:08.757 回答