【发布时间】:2013-05-19 15:17:32
【问题描述】:
我有一个名为 overlay_server 的类,它有一个公共方法
void member_list_server(boost::asio::io_service &io_service){
现在我想在一个新线程中运行它。所以我创建了一个新线程,并在其构造函数中使用了 bind。
在我在 void member_list_server 函数中创建 io_service 之前。 但是现在我正在尝试在 main 中创建一个 io_service 对象并将其传递给我得到错误的这个线程?
int main(){
boost::asio::io_service io_service_;
overlay_server overlay_server_(8002);
boost::thread thread_(
boost::bind(&overlay_server::member_list_server, overlay_server_, io_service_)
);
-
为什么会报错
错误 C2248:“boost::noncopyable_::noncopyable::noncopyable”:无法访问在类“boost::noncopyable_::noncopyable”中声明的私有成员
我还将创建需要 io_service 的其他类的实例。 最好的方法是什么,我应该在 main 中创建一个 io_service 对象并将其传递给所有线程吗?
或者在我将来创建的所有线程中创建一个单独的线程?
【问题讨论】:
-
你有一些不可复制的东西,并且 bind 打算复制它。根据 boost::bind 的文档,您可以使用 boost::ref 或 boost::cref 来解决这个问题,但要注意悬空引用的典型危险。
-
另外,绑定 boost:ref(io_service) 后,注意
io_service必须比线程长,否则会有一个悬空引用。所以io_service不能像你的例子那样是本地的。 -
为什么不让io_service成为所有线程都可以访问的类成员呢?这就是我所做的。
标签: c++ multithreading boost bind boost-asio