多线程信号量的使用

原创 2016年05月31日 21:15:53

公司业务上写了一个小模块,其中有一个功能是需要等待一个线程执行完一个函数之后,在另一个线程做出反应。

之前自己的写法是使用一个循环不断的去监视一个标志值,当标志值变化时候,代表执行完毕。但是这么做的话有一些缺陷,一个是不Sleep的话,那么占用很高的CPU使用率,显然不可行。Sleep的话,则该模块效率提不上来,就算是仅仅1MS,那么模块的速率就降到了一秒100以内了,是不可以被接受的。

陷入这种囧境还是由于自己知识水平限制,在多线程方面积累不足。

后在指导下找到了使用信号量的办法进行多线程的同步工作。

    int nRet = MsgQueue_SendNoBlock(pMPRemoteClient->pMsgSend, pMpRemoteSend);
    if (nRet != ERR_SUCCESS)
    {
        NG_free(pMpRemoteSend);
        return MP_ERR_FAILED;
    }

    //等待事件
    NG_WaitEvent(pMPRemoteClient->phSlaveEvent[nThreadNo]);

    NGtimeEnd = NGClock_GetTicks();
    if (NGClock_TimeDiff(NGtimeEnd, NGtimeBegin) >= 
        pMPRemoteClient->piFuncTimeMs[nFuncId])
    {
        return MP_ERR_SEND_TIMEOUT;
    }
    if (pMPRemoteClient->pDataSlaveFlag[nThreadNo] == iDataSlaveFlag)
    {
        return MP_ERR_SUCCESS;
    }

void NG_WaitEvent( HANDLE hEvent )
{
    MCAPI_EVENT *pEvent ;
    REAL_HANDLE *pHandle ;

    pHandle = (REAL_HANDLE *)hEvent;

    if ( pHandle == NULL || pHandle->nId != HANDLE_ID_NGEVENT )
    {
        return;
    }
    pEvent = (MCAPI_EVENT *)(pHandle-> pObject);

    ( void)sem_wait (&(pEvent-> sem));//这里会自动等到该值大于0后减去1

    return;
}

void NG_SendEvent( HANDLE hEvent ) 
{
    MCAPI_EVENT *pEvent ;
    REAL_HANDLE *pHandle ;

    pHandle = (REAL_HANDLE *)hEvent;

    if ( pHandle == NULL || pHandle->nId != HANDLE_ID_NGEVENT )
    {
        return;
    }
    pEvent = (MCAPI_EVENT *)(pHandle-> pObject);

    ( void)sem_post (&(pEvent-> sem));// 这里信号量加1

    return;
}
上面代码的两个模块,SendEvent WaitEvent实际上是对Linux信号函数的封装。

主要是下面几个函数,用于多线程同步。使用信号量,能在一个线程等待另一个线程完成某项工作,然后继续进行工作。

于是工作上的小难点被突破了。

改用信号量之后,程序在效率和性能方面大幅度提升了。

int sem_init(sem_t *sem,int pshared,unsigned int value); 
int sem_destroy(sem_t *sem); 
int sem_wait(sem_t *sem); 
int sem_trywait(sem_t *sem); 
int sem_post(sem_t *sem); 
int sem_getvalue(sem_t *sem); 


相关文章推荐

JAVA多线程顺序执行(使用join,lock,condition,信号量)原理和java源代码

java多线程顺序执行问题 使用join 假设我要让3个线程按照顺序打印ABC,那么可以使用Join,如果要求多线程按顺序循环打印,则不能用join了 join关键字 join是Thread类的一个方...

java多线程-Semaphore信号量使用

介绍   信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。 概念   Semaphore分为单值和多值...

多线程,信号量的简单使用 GCD

基本概念关于iOS开发中,多线程基本的概念和基本使用,我在这里就不在重复说了。但是为了照顾到有的同学可能还不是对基本的概念不熟悉,可以参考一下这篇文章并发其实很简单说说信号量,并发数如果你有计算机基础...

Linux多线程——使用信号量同步线程

信号量、同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆,关于用于进程间通...

使用System V信号量实现多线程互斥

POSIX Thread中提供了非常强大的线程互斥机制, 如 pthread_mutex_XXXX / pthread_cond_XXXX 以及 semaphore(sem_wait/sem_post...

【多线程】使用信号量进行同步

信号量是最早出现的用来解决进程同步与互斥问题的机制(也可实现进程通信),包括一个称为信号量的变量及对它进行的两个原语操作。信号量为一个整数,我们设这个信号量为:sem。很显然,我们规定在sem大于等于...

Linux多线程——使用信号量同步线程

信号量、同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆,关于用于进程间通...

多线程下临界区,互斥量,信号量和事件的差异和使用

多线程下临界区,互斥量,信号量和事件的差异和使用 标签: 多线程数据库连接池windows数据库threadblog 2012-08-06 23:07 4471人阅读 评论(0...

IOS多线程使用GCD与信号量实现生产者与消费者模式

#import @interface ViewController : UIViewController @property(strong,nonatomic) NSMutableArray* ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程信号量的使用
举报原因:
原因补充:

(最多只允许输入30个字)