2015-04-17 33 views
8

可以混合使用boost::threadstd::thread之间的东西,还是应该为每个功能使用一组功能?可以使用boost :: threads中的std :: this_thread *函数吗?

我问,因为我的代码使用boost::thread S,但我发现,设置系统时间回来的时候boost::this_thread::sleep_for工作不正常,但std::this_thread::sleep_for呢,所以我想改变我的睡眠功能调用,避免改变如果可能的话,我所有的boost::thread s到std::thread

+3

混业经营将明确给予未定义行为。如果你的标准库像Boost's一样使用足够的代码,它可能会工作,但我认为它的可能性相当低(尽管当你不告诉我们你是什么编译器/库时,甚至不可能做出有根据的猜测使用)。 –

+0

只是一个fyi,boost 1.58修复了你正在讨论的睡眠错误(今天发布) –

回答

1

在实践中,你可能会忽略iff /因为这些实现使用相同的实现(例如,linux上的pthread)。

但是,您打破不变式。简单示例:Boost线程的中断点不会与非增强同步基元(包括std::this_thread::sleep_*)一起工作。

所以我avice针对实际混合库控制关系的关联线程,免得你想冒险运行到suprises¹

当然,如果库有完全独立的担忧(例如,它们使用线程内部,“在黑匣子中“),在一个过程中将这些库结合起来应该没有问题。


¹我可以看到死锁发生,数据种族/泄漏不需要想象力未免(认为线程本地数据的支持/ call_once的/ set_value_at_thread_exit ...)

1

在一个线程中混用API是不可取的。正如@Jerry Coffin所提到的,你很可能遇到未定义的行为。这些API所依赖的线程本地状态可能与其他API创建的线程不兼容。

但是,在一个过程中分别使用std::threadboost::thread应该没问题。由于@红色警报说1.58修复了这个错误,这应该可以解决你的问题。否则,您可以暂时恢复到usleep()以及#ifdef对不同平台的类似功能。

+0

我认为'usleep'仍然会破坏库不变量;好处在于它使得这个更清晰。例如。很少有人会期望中断点与神奇的'usleep'一起工作 – sehe

相关问题