【问题标题】:Call Thread.yield() or equivalent from C (NDK)从 C (NDK) 调用 Thread.yield() 或等效项
【发布时间】:2011-08-04 08:05:42
【问题描述】:

我在带有 SDK 2.2 的 Android 2.3.3 中有一个 AsyncTask。

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

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

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

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

有什么建议吗?

【问题讨论】:

  • 您可能希望将 C 标签添加到您的问题中,以便订阅该标签的人看到它。
  • 你是对的。谢谢。
  • 我不了解 android,但请注意,在某些平台上“Thread.yield()”、“sched_yield()”、“pthread_yield()”、“Sleep(0)” ,或其他什么,实际上是一个 noop。

标签: android c++ c multithreading android-ndk


【解决方案1】:

如果真的想从 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...)    
}

不要忘记错误检查。

【讨论】:

    【解决方案2】:

    您可以使用sched_yield()

    (根据史蒂文·贝尔的评论编辑)

    【讨论】:

    • Android 没有 pthread_yield();您必须改用 POSIX sched_yield()。
    • @StevenBell 这应该是答案
    猜你喜欢
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 2023-03-19
    • 2012-01-26
    • 1970-01-01
    • 2011-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多