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

时间:2013-05-03 06:50:51

标签: c++ boost pthreads mutex boost-thread

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

这是Boost代码,我找到了here

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()和singalling变量是否相同:

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);

我是在正确的轨道上吗?

1 个答案:

答案 0 :(得分:1)

Boost线程原语的语义基于 pthread,所以在那个级别上应该没有区别。 然而,Boost将它们包装在基于C ++类的接口中 特别是,支持RAII隐含的东西,如锁定 互斥;如果你想直接使用pthread,你肯定会 例如,想要实现自己的作用域锁定变体。 按照目前的情况,push的实现无法释放 如果m_queue.push( data )抛出则锁定(并且它可以抛出)。

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

编辑:

经过更多调查:我看到你引用的网站是 由Anthony Williams撰写,他的声誉非常高 关于线程问题。在页面的底部,他 有一个“最终代码”版本 正确,在每一个 详情。虽然我看起来并不清楚,但在阅读时 页面,我认为所有前面的版本(包括 你要复制的一个是“初稿”,并且是已知的 在一些细节上是不正确的。 (我仍然认为他应该 让这个更清楚。有一些非常危险的做法 在他的第一个例子中:例如,返回引用。)