gpt4 book ai didi

c++ - Boost.Bind'ing 成员函数并将其发布到 io_service

转载 作者:行者123 更新时间:2023-11-30 02:36:50 25 4
gpt4 key购买 nike

我正在尝试包装一个表示由 io_service 完成的工作的对象。

作业是任意类型的,不一定是IO操作。与描述的相似 here .

我已经能够发布绑定(bind)的常规函数,但无法发布成员函数

为什么这段代码不能编译:

#include <iostream>
#include "boost/asio.hpp"
#include "boost/thread.hpp"

using namespace std;
namespace asio = boost::asio;

class class_fun1 {
public:

void an_expensive_calculation(int num) {
cout << "an_expensive_calculation: " << num << endl;
}
};

class class_fun2 {
public:
void a_long_running_task(int num) {
for (int x = 0; x < num; ++x)
cout << "a_long_running_task: " << num << endl;
}
};

int main(int argc, char** argv) {

int my_thread_count = 4;

asio::io_service io_service;
asio::io_service::work work(io_service);

boost::thread_group threads;
for (std::size_t i = 0; i < my_thread_count; ++i)
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));

class_fun1 f1();
class_fun2 f2();
io_service.post(boost::bind(&class_fun1::an_expensive_calculation, &f1, 42));
io_service.post(boost::bind(&class_fun2::a_long_running_task, &f2, 123));

threads.join_all();

return 0;
}

虽然这个有效:

#include <iostream>
#include "boost/asio.hpp"
#include "boost/thread.hpp"

using namespace std;
namespace asio = boost::asio;

void an_expensive_calculation(int num) {
cout << "an_expensive_calculation: " << num << endl;
}

void a_long_running_task(int num) {
for (int x = 0; x < num; ++x)
cout << "a_long_running_task: " << num << endl;
}


int main(int argc, char** argv) {

int my_thread_count = 4;

asio::io_service io_service;
asio::io_service::work work(io_service);

boost::thread_group threads;
for (std::size_t i = 0; i < my_thread_count; ++i)
threads.create_thread(boost::bind(&asio::io_service::run, &io_service));

io_service.post(boost::bind(an_expensive_calculation, 42));
io_service.post(boost::bind(a_long_running_task, 123));

threads.join_all();

return 0;
}

我浏览了一些在线教程和文档,据我所知,首先应该可行。我按照绑定(bind)成员函数并将其发布到 io_service 的指南进行操作,但它不起作用。

最佳答案

问题是 most vexing parse 的结果.特别是,以下声明了两个函数:

class_fun1 f1(); // function declaration
class_fun2 f2(); // function declaration

第一个声明了一个名为 f1 的函数,它不接受任何参数并返回一个 class_func1 的实例。它不声明标识符为 f1class_func1 实例。类似的情况也适用于 f2

要解决此问题,请删除括号,将代码更改为:

class_fun1 f1; // declares a variable
class_fun2 f2; // declares a variable

鉴于 clang 的编译器输出消息,有时打开编译器警告并尝试使用它进行编译可能会很好。特别是,当试图用 clang 解析原始代码时,它提供了一些 helpful output :

main.cpp:35:18: error: empty parentheses interpreted as a function declaration [-Werror,-Wvexing-parse]
class_fun1 f1();
^~
main.cpp:35:18: note: remove parentheses to declare a variable
class_fun1 f1();

此外,由于 boost::asio::work对象的生命周期,程序永远不会终止,因为线程组永远不会成功加入。要解决此问题,请考虑在加入线程组之前销毁工作对象或在运行之前将工作发布到 io_service 中。有关 io_service 何时阻止和取消阻止的更多详细信息,请考虑阅读 this问题。

关于c++ - Boost.Bind'ing 成员函数并将其发布到 io_service,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32282974/

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