我发现了一些使用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);
我是在正确的轨道上吗?
答案 0 :(得分:1)
Boost线程原语的语义基于
pthread
,所以在那个级别上应该没有区别。
然而,Boost将它们包装在基于C ++类的接口中
特别是,支持RAII隐含的东西,如锁定
互斥;如果你想直接使用pthread
,你肯定会
例如,想要实现自己的作用域锁定变体。
按照目前的情况,push
的实现无法释放
如果m_queue.push( data )
抛出则锁定(并且它可以抛出)。
此外,您应该在释放锁之前发出信号。 (这是 你的Boost代码和你的pthread代码都有错误。)和 避免你引用的网站中的代码:它完全坏了, 而且根本不是线程安全的。
经过更多调查:我看到你引用的网站是 由Anthony Williams撰写,他的声誉非常高 关于线程问题。在页面的底部,他 有一个“最终代码”版本 正确,在每一个 详情。虽然我看起来并不清楚,但在阅读时 页面,我认为所有前面的版本(包括 你要复制的一个是“初稿”,并且是已知的 在一些细节上是不正确的。 (我仍然认为他应该 让这个更清楚。有一些非常危险的做法 在他的第一个例子中:例如,返回引用。)