Boost和Pthread条件变量之间的差异
Difference between Boost and Pthread condition variables
我发现了一些使用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代码中都存在错误。(和避免你引用的网站中的代码:它完全被破坏了,并且根本不是线程安全的。
编辑:
经过更多的调查:我看到你引用的网站由安东尼·威廉姆斯撰写,他享有极高的声誉关于线程问题。在页面底部,他有一个正确的"最终代码"版本,在细节虽然我不太清楚,但在阅读页面,我认为之前的所有版本(包括您正在复制的(作为"初稿"提供,并且已知在某些细节上是不正确的。(我仍然认为他应该让这一点更清楚。有一些极其危险的做法在他的第一个例子中:例如,返回引用。(
相关文章:
- 类与私有变量的其他类之间的线程安全性
- 编辑字符串以包含括号 c++ 之间的变量
- 子目录之间的 CMAKE 共享变量
- 在.cpp文件之间传递全局字符串变量?
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较
- 如何在不同的CMakeList.txt之间共享变量?
- C++ 编译时在两个变量之间交替
- 创建变量之间的运算符排列
- 通过require在不同的Lua状态之间共享全局变量
- 成员变量的不同"kinds"之间的区别
- 互锁变量访问(在布尔值上)和 std::atomic_flag 之间的区别
- 在没有外部文件的情况下在应用会话之间保存变量
- 计算两个uint8_t变量之间差值的最快方法是什么?
- 有没有办法在两个共享对象之间使用相同的全局变量?
- lambda 表达式中引用捕获的 constexpr 变量和非显式捕获的 constexpr 变量之间的区别
- 在成员函数之间传递const变量为数组的索引
- 直接为浮点变量分配十六进制整数与通过指针转换分配之间的区别
- 如果两个线程调用同一个函数,但函数中的所有变量都是局部变量,我还需要担心线程之间共享数据吗?
- 使用文件锁定的进程之间的条件变量
- C++ 静态成员变量 - 文件之间的访问