2011-08-04 113 views
2

我在Android 2.3.3中使用SDK 2.2创建了一个AsyncTask。从C(NDK)调用Thread.yield()或等价物

在任务/类中,我正在使用带有NDK的C库。

而不是在Java中有一个while(condition)循环,我在C中有这个循环,以避免在每次循环迭代期间通过JNI进行昂贵的调用。

如果我在Java中有while(condition)循环,我会在每个循环迭代结束时调用Thread.yield()以允许线程挂起。

C有可能获得相同的行为吗? 我在C的while(condition)循环的末尾用usleep(10)试过了,但是我没有得到预期的行为。

有什么建议吗?

+0

您可能需要将C标签添加到您的问题中,以便订阅该标签的用户可以看到它。 –

+0

你说得对。谢谢。 –

+2

我不知道关于android,但请注意,在某些平台上的“Thread.yield()”,“sched_yield()”,“pthread_yield()”,“Sleep(0)”或其他什么,实际上是一个空操作。 –

回答

2

您可以使用sched_yield()

(史蒂芬贝尔的评论后编辑)

+4

Android没有pthread_yield();您必须改用POSIX sched_yield()。 –

+0

@StevenBell这应该是答案 – Eun

3

如果真正想从C代码调用Thread.yield()一个可以做到以下几点:

Java_de_company_MyClass_setupJNI(JNIEnv* env, jobject thiz) { 

    (...snip...) 

    jclass threadClass = (*env)->FindClass(env, "java/lang/Thread"); 
    jmethodID yieldFunctionID = (*env)->GetStaticMethodID(env, threadClass, "yield", "()V"); 

    (*env)->CallStaticVoidMethod(env, threadClass, yieldFunctionID); 

    (...snip...)  
} 

不要忘记错误检查。