TinyWebServer
TinyWebServer copied to clipboard
m_cond.wait( )的问题
//pop时,如果当前队列没有元素,将会等待条件变量 bool pop(T &item) {
m_mutex.lock();
while (m_size <= 0)
{
// 这里若线程wait成功,函数返回0
if (!m_cond.wait(m_mutex.get()))
{
m_mutex.unlock();
return false;
}
}
m_front = (m_front + 1) % m_max_size;
item = m_array[m_front];
m_size--;
m_mutex.unlock();
return true;
}
这是源码中block_queue中的pop函数,wait那一行是不是存在逻辑错误?
而在微信公众号解析代码中:if (0 != pthread_cond_wait(m_cond, m_mutex)) ,两者有出入
逻辑上没有错误,pthread_cond_wait(m_cond, m_mutex)成功返回0,失败返回非0,因此微信公众号解析代码表达的是wait失败,而这个repo中对wait代码进行了封装,成功返回的是true,失败返回false,这里加个!和上面那个逻辑是一样的,我有疑问的是,wait封装的代码中又对m_mutex加了锁,这样两次加同一把锁会不会有问题?
逻辑上没有错误,pthread_cond_wait(m_cond, m_mutex)成功返回0,失败返回非0,因此微信公众号解析代码表达的是wait失败,而这个repo中对wait代码进行了封装,成功返回的是true,失败返回false,这里加个!和上面那个逻辑是一样的,我有疑问的是,wait封装的代码中又对m_mutex加了锁,这样两次加同一把锁会不会有问题?
没有问题,可以看cond类的wait()函数定义,作者是把m_mutex加锁操作给注释掉的,所以并没有加两次锁。但这样导致的问题是可能会导致pthread_cond_wait系统调用并未按POSIX规范来书写,未来可能会出现竞态条件,留下了一些隐患。