可以使用 boost::threads 中的 std::this_thread* 函数吗?
Is it okay to use std::this_thread* functions from boost::threads?
混合搭配 boost::thread
和 std::thread
中的东西是否可以,还是应该分别使用一组函数?
我问是因为我的代码使用了 boost::thread
s,但我发现 boost::this_thread::sleep_for
在将系统时间调回时表现不正常,但 std::this_thread::sleep_for
可以,所以我想更改睡眠函数调用,并尽可能避免将所有 boost::thread
更改为 std::thread
。
不建议在一个线程中混合使用 API。正如@Jerry Coffin 提到的,您很可能 运行 进入未定义的行为。这些 API 所依赖的线程本地状态可能与不同 API.
创建的线程不兼容
不过,在一个进程中分开使用std::thread
和boost::thread
应该没问题。由于@Red Alert 说 1.58 修复了错误,这应该可以解决您的问题。否则,您可以暂时恢复为 usleep()
以及针对不同平台使用 #ifdef
的类似功能。
在实践中,您可能会逃避某些事情 iff/because 实现使用相同的实现(例如 linux 上的 pthread
)。
但是,您将打破不变量。简单示例:Boost Thread 的中断点将无法使用非 boost 同步原语(包括 std::this_thread::sleep_*
)。
因此我建议实际上不要混合 库来控制相关线程,以免你想冒险 运行 出人意料 ¹
当然,如果库具有完全独立的关注点(例如,它们在内部使用线程,"in the black box"),那么将这些库组合到一个进程中应该没有问题。
¹ 我可以看到死锁发生,数据 races/leaks 不需要大量的想象力(想想线程本地数据 support/call_once/set_value_at_thread_exit
...)
混合搭配 boost::thread
和 std::thread
中的东西是否可以,还是应该分别使用一组函数?
我问是因为我的代码使用了 boost::thread
s,但我发现 boost::this_thread::sleep_for
在将系统时间调回时表现不正常,但 std::this_thread::sleep_for
可以,所以我想更改睡眠函数调用,并尽可能避免将所有 boost::thread
更改为 std::thread
。
不建议在一个线程中混合使用 API。正如@Jerry Coffin 提到的,您很可能 运行 进入未定义的行为。这些 API 所依赖的线程本地状态可能与不同 API.
创建的线程不兼容不过,在一个进程中分开使用std::thread
和boost::thread
应该没问题。由于@Red Alert 说 1.58 修复了错误,这应该可以解决您的问题。否则,您可以暂时恢复为 usleep()
以及针对不同平台使用 #ifdef
的类似功能。
在实践中,您可能会逃避某些事情 iff/because 实现使用相同的实现(例如 linux 上的 pthread
)。
但是,您将打破不变量。简单示例:Boost Thread 的中断点将无法使用非 boost 同步原语(包括 std::this_thread::sleep_*
)。
因此我建议实际上不要混合 库来控制相关线程,以免你想冒险 运行 出人意料 ¹
当然,如果库具有完全独立的关注点(例如,它们在内部使用线程,"in the black box"),那么将这些库组合到一个进程中应该没有问题。
¹ 我可以看到死锁发生,数据 races/leaks 不需要大量的想象力(想想线程本地数据 support/call_once/set_value_at_thread_exit
...)