pthread_cond_signal不会有“惊群现象”产生,他最多只给一个线程发信号
假如有多个线程正在阻塞等待着这个条件变量的话,那么是根据各等待线程优先级的高低确定哪个线程接收到信号开始继续执行。
如果各线程优先级相同,则根据等待时间的长短来确定哪个线程获得信号。但无论如何一个pthread_cond_signal调用最多发信一次。
pthread_cond_wait必须放在pthread_mutex_lock和pthread_mutex_unlock之间,因为他要根据共享变量的状态来决定是否要等待,而为了不永远等待下去所以必须要在lock/unlock队中
例如:pthread_mutex_lock(&alsa_params->playback_mutex);
while( !alsa_params->wait_flag )
{
adec_print("yvonnepthread_cond_wait\n");
pthread_cond_wait(&alsa_params->playback_cond, &alsa_params->playback_mutex);
}
alsa_params->wait_flag=1;
pthread_mutex_unlock(&alsa_params->playback_mutex);
pthread_cond_signal即可以放在pthread_mutex_lock和pthread_mutex_unlock之间,也可以放在pthread_mutex_lock和pthread_mutex_unlock之后,但是各有各缺点
pthread_mutex_lock(&alsa_param->playback_mutex);
alsa_param->wait_flag=1;//yvonneadded
pthread_cond_signal(&alsa_param->playback_cond);
pthread_mutex_unlock(&alsa_param->playback_mutex);
在Linux 线程中,有两个队列,分别是cond_wait队列和mutex_lock队列, cond_signal只是让线程从cond_wait队列移到mutex_lock队列,而不用返回到用户空间,不会有性能的损耗
JNIEXPORT jint
JNI_OnLoad(JavaVM* vm, void* reserved)
{
jint ret;
JNIEnv* env = NULL;
if (vm->GetEnv((void**)&env, JNI_VERSION_1_4) != JNI_OK || NULL == env) {
return -1;
}
fields.gJavaVM = vm;
fields.env = env; 在onload时候保存下来jvm和env,
ret = register_amplayer_amavjni(env);
}
struct fields_t {
JavaVM *gJavaVM ;
JNIEnv* env;
jmethodID post_event;
};
static struct fields_t fields;
JNIEnv 指针一样,jobject指针也不能在多个线程中共享.
就是说,不能直接在保存一个线程中的jobject指针到全局变量中,然后在另外一个线程中使用它
player->mClass = (jclass)env->NewGlobalRef(clazz);
env->DeleteGlobalRef(player->mObject);
//初始化时指定post_event
fields.post_event = env->GetStaticMethodID(clazz, "postEventFromNative",
"(Ljava/lang/Object;IIILjava/lang/Object;)V");
在postEventFromNative调用
amavjni mp = (amavjni) ((WeakReference<Object>) mediaplayer_ref).get();
mp.handle_events(what, arg1, arg2);
if (monStateChangeLisenser != null)
monStateChangeLisenser.StateChanged(what, arg1, arg2);//StateChanged提供子类实现
#define LOGI(...) __android_log_print(ANDROID_LOG_INFO,LOG_TAG,__VA_ARGS__)__VA_ARGS__ 成不定参数