多线程信号量的使用

原创 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); 


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

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

qt线程同步之信号量

#include #include #include #include #include #include #include using namespace std; const i...
  • zhangtaohbwh
  • zhangtaohbwh
  • 2016年08月28日 01:03
  • 925

windows多线程同步机制---信号量

1 信号量     通知的作用,和事件类似.但是与事件不同.事件只维护一个值0或者1.     信号量维护一个变量,0时无信号,大于0有信号.        2 信号量的使用     2.1...
  • rankun1
  • rankun1
  • 2016年02月17日 20:26
  • 473

C++多线程实例-信号量

windows下的信号量: 使用信号量内核对象进行线程同步主要会用到 CreateSemaphore()、OpenSemaphore()、ReleaseSemaphore()、 WaitForS...
  • Blues1021
  • Blues1021
  • 2015年03月23日 00:01
  • 1757

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

信号量、同步这些名词在进程间通信时就已经说过,在这里它们的意思是相同的,只不过是同步的对象不同而已。但是下面介绍的信号量的接口是用于线程的信号量,注意不要跟用于进程间通信的信号量混淆。相似地,线程同步...
  • ljianhui
  • ljianhui
  • 2013年09月01日 00:09
  • 44485

windows信号量使用

转载自:http://blog.csdn.net/wangweitingaabbcc/article/details/6833265 信号量(Semaphore)内核对象对线程的同步方式与前面几种方...
  • u012377333
  • u012377333
  • 2015年03月30日 15:06
  • 1567

python爬虫(多线程&锁&信号量)

1、多线程(无锁):threading.Thread(target = ***).start() 2、多线程(锁 & 单线程): threading.Lock() threading.Thread(...
  • trb331617
  • trb331617
  • 2017年06月04日 09:09
  • 687

linux下多线程编程,各种锁,信号量

转自http://mingxinglai.com/cn/2013/06/mutil-threads/ 最近研究mysql源码,各种锁,各种互斥,好在我去年认真学了《unix环境高级编程》, 虽然...
  • JY_Sharer
  • JY_Sharer
  • 2013年11月25日 19:47
  • 1864

几个简单程序加深你对多线程和信号量的理解

#include #include HANDLE g_hSemp1 = NULL; HANDLE g_hSemp2 = NULL; DWORD WINAPI ThreadProc(LPVOID...
  • stpeace
  • stpeace
  • 2013年10月06日 22:58
  • 3494

【C/C++多线程编程之七】pthread信号量

多线程编程之信号量      Pthread是 POSIX threads 的简称,是POSIX的线程标准。          互斥量用来处理一个共享资源的同步访问问题,当有多个共享资源时,就...
  • Jiangweihll
  • Jiangweihll
  • 2014年05月03日 16:13
  • 7240
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:多线程信号量的使用
举报原因:
原因补充:

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