gpt4 book ai didi

c++ - Boost 和 Pthread 条件变量的区别

转载 作者:太空宇宙 更新时间:2023-11-04 11:55:25 24 4
gpt4 key购买 nike

我找到了一些使用 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() 和发送变量是否相同:

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++ 类的接口(interface)中,并且在特别是,隐式支持 RAII 用于锁定互斥;如果你想直接使用pthread,你肯定会例如,想要实现您自己的作用域锁变体。就目前而言,您的 push 实现未能释放如果 m_queue.push( data ) 抛出(它可以抛出)则锁定。

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

编辑:

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

关于c++ - Boost 和 Pthread 条件变量的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16353230/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com