多线程信号量的使用
来源:互联网 发布:惠州网络问政网站 编辑:程序博客网 时间:2024/06/03 05:02
公司业务上写了一个小模块,其中有一个功能是需要等待一个线程执行完一个函数之后,在另一个线程做出反应。
之前自己的写法是使用一个循环不断的去监视一个标志值,当标志值变化时候,代表执行完毕。但是这么做的话有一些缺陷,一个是不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);
0 0
- 多线程信号量的使用
- 多线程信号量的使用
- linux 多线程编程 ---- 信号量的使用
- linux 多线程编程---- 信号量的使用
- Linux多线程信号量的概念和使用
- 多线程,信号量的简单使用 GCD
- C++ 多线程中互斥信号量的使用
- linux 多线程信号量和互斥锁的使用
- 使用信号量管理多线程
- 多线程之使用信号量
- 【多线程】使用信号量进行同步
- 多线程 : Java 信号量 Semaphore 使用
- java多线程-Semaphore信号量使用
- SDL2.0 多线程使用信号量
- java多线程-Semaphore信号量使用
- Java多线程学习笔记——信号量的使用
- 多线程采用相对时间的信号量同步方法(使用信号量)
- 信号量与多线程的退出
- PHP三种运行方式mod_php5/cgi/fast-cgi
- ViewPager和Fragment使用时候的适配器
- 联合训练图论场
- 网站兼容——火狐浏览器刷新没有清空表单
- spring基于@ExceptionHandler的异常处理
- 多线程信号量的使用
- Mac系统开发常见问题-80端口被占用的解决方案2-使用Nginx解决
- 简谈俩种不同方式对vector容器的 自定义结构体进行排序
- TCP定时器介绍
- 贪心法——部分背包问题
- kafka+zookeeper环境配置
- apple pay代码实现
- 大数相加
- Linux进程间通信——使用共享内存