TinyWebServer icon indicating copy to clipboard operation
TinyWebServer copied to clipboard

m_cond.wait( )的问题

Open ghost opened this issue 3 years ago • 2 comments

//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)) ,两者有出入

ghost avatar Mar 03 '21 13:03 ghost

逻辑上没有错误,pthread_cond_wait(m_cond, m_mutex)成功返回0,失败返回非0,因此微信公众号解析代码表达的是wait失败,而这个repo中对wait代码进行了封装,成功返回的是true,失败返回false,这里加个!和上面那个逻辑是一样的,我有疑问的是,wait封装的代码中又对m_mutex加了锁,这样两次加同一把锁会不会有问题?

Monkey-D-Luffy-star avatar Jul 13 '22 06:07 Monkey-D-Luffy-star

逻辑上没有错误,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规范来书写,未来可能会出现竞态条件,留下了一些隐患。

Benxaomin avatar Feb 19 '24 12:02 Benxaomin