Boost和Pthread条件变量之间的差异

Difference between Boost and Pthread condition variables

本文关键字:之间 变量 Pthread 条件 Boost      更新时间:2023-10-16

我发现了一些使用boost线程、互斥和条件变量的代码,但我想尝试用posix线程重写这些代码。

这是我在这里找到的Boost代码:

void push(Data const& data)
{
    boost::mutex::scoped_lock lock(the_mutex);
    the_queue.push(data);
    lock.unlock();
    the_condition_variable.notify_one();
}

在我使用pthreads的代码中,我不确定我是否以正确的方式使用条件变量,因为我不确定notify_one((和信号变量是否相同:

void push(T const& data)
{
    pthread_mutex_lock(&m_mutex);
    m_queue.push(data);
    pthread_mutex_unlock(&m_mutex);
    pthread_cond_signal(&m_condition);
}

初始化之前就这样完成了:

pthread_mutex_t m_mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t m_condition = PTHREAD_COND_INITIALIZER;

在另一点上,他们正在使用the_condition_variable.wait(lock);。。。这一行我会用pthreads重写如下:pthread_cond_wait( &m_condition, &m_mutex);

我走对了吗?

Boost线程原语的语义基于pthread,所以在该水平上应该没有差异。Boost将它们封装在一个基于C++类的接口中特别是,对于锁定互斥;如果你想直接使用pthread,你肯定会例如,想要实现自己的作用域锁变体。目前,push的实现未能释放如果m_queue.push( data )抛出(并且它可以抛出(,则锁定。

此外,您应该在释放锁之前发出信号。(这是Boost代码和pthread代码中都存在错误。(和避免你引用的网站中的代码:它完全被破坏了,并且根本不是线程安全的。

编辑:

经过更多的调查:我看到你引用的网站由安东尼·威廉姆斯撰写,他享有极高的声誉关于线程问题。在页面底部,他有一个正确的"最终代码"版本,在细节虽然我不太清楚,但在阅读页面,我认为之前的所有版本(包括您正在复制的(作为"初稿"提供,并且已知在某些细节上是不正确的。(我仍然认为他应该让这一点更清楚。有一些极其危险的做法在他的第一个例子中:例如,返回引用。(