2011-08-04 69 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...)  
} 

不要忘記錯誤檢查。