• 多线程中避免使用信号量


    项目中遇到一个bug,因为接入了几家越狱平台:91、同步推、PP助手,在设备上安装了三个应用,启用其中任意一个,另外二个启动后无法创建发送socket消息,从而导致游戏直接死在登录那里,再次点击登录时线程才会被唤醒(无法发送的原因定位到,是因为在调用sem_post方法后无法将线程唤醒)。之后我尝试将信号量改为条件变量,就再也没有遇到那个问题了。具体改写的几个方法:

    sem_open/sem_init => pthread_cond_init

    sem_close/sem_destroy => pthread_cond_destroy

    sem_wait => pthread_cond_wait

    sem_post => pthread_cond_signal

     

    信号量不仅可以用于进程也可用于线程,它比条件变量要复杂很多,条件变量仅限于线程内使用。

    翻看cocos2d-x的源码中,纹理缓存用到了信号量:

    //CCTextureCache.cpp
    // lazy init
    if (s_pSem == NULL)
    {
    #if CC_ASYNC_TEXTURE_CACHE_USE_NAMED_SEMAPHORE
    s_pSem = sem_open(CC_ASYNC_TEXTURE_CACHE_SEMAPHORE, O_CREAT, 0644, 0);
    if( s_pSem == SEM_FAILED )
    {
    CCLOG( "CCTextureCache async thread semaphore init error: %s ", strerror( errno ) );
    s_pSem = NULL;
    return;
    }
    #else
    int semInitRet = sem_init(&s_sem, 0, 0);
    if( semInitRet < 0 )
    {
    CCLOG( "CCTextureCache async thread semaphore init error: %s ", strerror( errno ) );
    return;
    }
    s_pSem = &s_sem;
    #endif

    光信号量的初始化就得根据不同平台来写代码,而用条件变量进行替代则只需要一行代码,不需要针对不同的平台写不同的代码,代码量小了。

     

    避免使用信号量,除了维护的代码较多以外,还有一个重要的原因是它容易用错。陈硕在他的著作《Linux多线程服务端编程》P85页中明确指出了,避免使用信号量(semaphore),它的功能与条件变量重合,但容易出错。在《并发编程的 15 条建议(译)》也提及如果Mutex就能解决问题,就不要使用信号量semaphore。

     

    关于使用信号量容易出错的例子,这里倒有一个:关于sem_open(3),所有信号量这种东东最好不要在线程内使用,进程间通信就要好好去研究它了…

     

    附:sem_open的man手册链接>>

  • 相关阅读:
    有限责任公司改为股份有限公司的主要流程
    社区商业招商商户资源从哪里来?
    赢商网 > 赢商新闻 > 社区商业
    万科北京区域V-learn发布 系V-LINK产品系中首批产品
    某社区商业之商业街招商方案1
    社区商业试玩O2O:良渚文化村新街坊牵手阿里巴巴
    社区商铺招商工作如何展开
    住宅社区商业招商方案
    社区商业招商3大难题
    CSS 空中飘动的云动画
  • 原文地址:https://www.cnblogs.com/meteoric_cry/p/3938387.html
Copyright © 2020-2023  润新知