linux 线程等待队列

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__ 成不定参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值