2012-07-30 2 views
0

MonitorEnter JNI 함수에 obj가 있는지 확실하지 않습니다. 그것은 obj가 네이티브 함수 또는 동기화하고자하는 공유 변수에서 매개 변수로 전달 되었습니까? 두 개의 스레드가 공유하는 buffer라는 변수가 있습니다. 이것은 내 코드입니다.MonitorEnter에서 obj 란 무엇입니까?

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr) 
{ 
    char buf[256]; 

    int len = (*env)->GetStringLength(env, jstr);  
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf); 
    (*env)->MonitorEnter(env, obj); // I don't think this is correct. 
    strcat(buffer, buf); // buffer is declared as global char buffer[256]; 
    (*env)->MonitorExit(env, obj); 
} 

편집 : 어때요? syncobj는 Activity에서 정적 객체로 정의되고 다른 스레드와 공유됩니다.

JNIEXPORT void JNICALL Java_company_com_HelloActivity_setBuffer(JNIEnv *env, jobject obj, jstring jstr, jobject syncobj) 
{ 
    char buf[256]; 

    int len = (*env)->GetStringLength(env, jstr);  
    (*env)->GetStringUTFRegion(env, jstr, 0, len, buf); 
    (*env)->MonitorEnter(env, syncobj); 
    strcat(buffer, buf); 
    (*env)->MonitorExit(env, syncobj); 
} 

답변

2

그것은 바로이 자바 코드에서와 동일합니다

synchronized (syncobj) // = MonitorEnter(env, syncobj) 
{ 
    // ... 
} // = MonitorExit(env, syncobj) 
0

첫 번째 조각은 synchronized(this)의 동일, 두 번째 조각은 synchronized(syncobj)입니다. 그러나 두 단편은 buffer에 액세스하는 다른 스레드가 this 또는 syncobj을 볼 수있는 경우에만 의미가 있습니다. 다른 스레드가 기본 스레드인지는 두렵습니다. 그렇다면 왜 원시 코드로 buffer을 만들겠습니까? 내가 맞다면, MonitorEnter/Exit가 불필요하게 비밀 스럽습니다. 당신은 사용할 수 있지만 다른 네이티브 스레드는 this 또는 syncobj에 대한 전역 참조를 보유해야합니다. 기본 잠금은 훨씬 깨끗한 솔루션처럼 보입니다. JVM 리소스가 아니라 네이티브 리소스를 잠그고 있습니다.

+0

감사합니다. 그러나 나는 당신의 대답을 분명히 이해하지 못합니다. 첫 번째 스 니펫은 잘못된 해결책이라는 것을 알고 있습니다. 하지만 두 번째 발췌 문장은 올바른 해결책이라고 생각합니다. 버퍼는 전역입니다. 스레드 A는 버퍼에 문자를 추가하고 스레드 B는 버퍼에서 문자를 제거합니다. 나는 단지 부속을 보였다. synobj를 Thread A에서 정적으로 생성하고이를 부분을 추가하기 위해 전달합니다. 스레드 B는 스레드 A에서 syobj를 가져 와서 부분을 꺼냅니다. – user1301568

+0

navtive 스레드의 의미를 알 수 없습니다. Thread in Java에서 확장 된 새로운 MyThread()에 의해 스레드를 만들었습니다. – user1301568

+0

그래서 버퍼의 양쪽 생성자 (A)와 소비자 (B)가 자바 스레드입니까? –