int32_t CChannelPoll::GetCmdNodeSize() { int32_t i32OldType; int32_t ret = -1; pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &i32OldType); pthread_cleanup_push(PTHREAD_MUTEX_UNLOCK, (void *)&m_mutex); pthread_mutex_lock (&m_mutex); ret = m_stNodeCtr.size(); pthread_mutex_unlock(&m_mutex); pthread_cleanup_pop(0); pthread_setcanceltype(i32OldType, NULL); return ret; }
时间: 2024-04-12 20:34:09 浏览: 148
beautiful-code-vs-mr-oldtype:jQuery 重构和使用 testium 的 E2E 测试
这段代码是一个函数 `GetCmdNodeSize()` 的实现,它返回一个整型值。
首先,函数中声明了两个整型变量 `i32OldType` 和 `ret`,并对 `ret` 进行了初始化为 -1。
然后,`pthread_setcanceltype(PTHREAD_CANCEL_DEFERRED, &i32OldType)` 设置线程的取消类型为 `PTHREAD_CANCEL_DEFERRED`,并将之前的取消类型保存在 `i32OldType` 变量中。
接下来,`pthread_cleanup_push(PTHREAD_MUTEX_UNLOCK, (void *)&m_mutex)` 将函数 `PTHREAD_MUTEX_UNLOCK` 和互斥锁 `m_mutex` 推入清理堆栈,以确保在线程取消或函数返回时能够正确释放互斥锁。
然后,`pthread_mutex_lock(&m_mutex)` 获取互斥锁 `m_mutex`,如果该锁已经被其他线程持有,则当前线程会被阻塞直到获取到锁。
接着,`ret = m_stNodeCtr.size()` 获取了一个名为 `m_stNodeCtr` 的容器的大小。
然后,`pthread_mutex_unlock(&m_mutex)` 释放了互斥锁,允许其他线程再次获取该锁。
接下来,`pthread_cleanup_pop(0)` 弹出清理堆栈,如果清理堆栈不为空,则执行栈顶的清理函数。
最后,`pthread_setcanceltype(i32OldType, NULL)` 恢复之前的取消类型。
最后,函数返回变量 `ret`,即容器的大小。
这段代码的作用是在多线程环境下安全地获取并返回容器的大小。使用了互斥锁来保证对共享资源的安全访问,并且使用了清理堆栈来确保在函数返回时正确释放互斥锁。同时,通过设置取消类型,可以控制线程在取消点的行为。
阅读全文