Boost asio和线程,如果我运行两个实例,我得到cpu在100%
Boost asio and thread, if i run two instances i get cpu at 100%
我创建了一个通过网络链接发送数据的控制台应用程序。我使用boost库,线程和asio库;目前我在Windows下运行它。如果我运行一个应用程序,它工作得很好,但如果我在两个不同的控制台打开两个实例,CPU负载就会达到100%,如果我关闭其中一个应用程序,它就会恢复正常。我只是使用了一个简单的套接字异步读写,和线程的条件变量和互斥。在处理这种情况时有什么特别的事情要做吗?我可以给你看一些代码,但我认为它没什么特别的:
socket->connect(tcp::endpoint(address::from_string(getAddress()),getPort()));
连接和
socket->async_read_some(buffer(receiveData),bind(&NetworkLink::handle_response, this,placeholders::error,placeholders::bytes_transferred));
在handle_response函数中用于异步读取。对于线程,我使用
boost::unique_lock<boost::mutex> messages_lock(message_received_mutex);
在删除所有内容并从头开始一个简单的测试项目之前,我想知道在这种情况下是否需要特别注意
好了,看来我找到问题了。首先,100%的CPU使用率是由于每个实例使用了50%的CPU(我使用的是双核PC)。我遍历了所有的代码,发现了这个。我在我的代码中有这个,在NetworkLink::handle_response函数中:
socket->async_read_some(
boost::asio::buffer(receiveData),
boost::bind(&NetworkLink::handle_response, this,
boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred));
io_service.run();
我使用了io_service.run();因为在此之前,软件无法接收数据。现在我删除了这行,我没有得到50%的CPU使用率,但是处理程序响应没有被调用,所以我不能接收任何数据。对此有什么想法吗?由于
PS:我创建了一个显示这个问题的小应用程序:
#include <iostream>
#include <boost/asio.hpp>
#include "boost/thread.hpp"
#include "boost/thread/mutex.hpp"
#ifdef _WIN32
#include "Windows.h"
#endif
using namespace boost::asio::ip;
using namespace std;
std::vector<uint8_t> buf;
boost::asio::io_service io_service;
boost::asio::ip::tcp::socket mysocket(io_service);
int handle_response(const boost::system::error_code &err,
size_t bytes_transferred)
{
// cout << bytes_transferred << ' ';
if (bytes_transferred > 0)
cout << buf.data() << ' ';
boost::asio::async_read(mysocket, boost::asio::buffer(buf),
boost::asio::transfer_at_least(1), &handle_response);
}
int mythread()
{
boost::asio::async_read(mysocket, boost::asio::buffer(buf),
boost::asio::transfer_at_least(1), &handle_response);
io_service.run();
}
int main()
{
int m_nPort = 12345;
buf.resize(100, '0');
boost::condition_variable message_received_condition;
boost::thread message_receiver_thread(&mythread);
boost::mutex messages_mutex;
tcp::endpoint endpoint(boost::asio::ip::address::from_string("127.0.0.1"),
m_nPort);
boost::unique_lock<boost::mutex> messages_lock(messages_mutex);
message_received_condition.notify_one();
cout << "Waiting for connection..." << endl;
Sleep(10000);
mysocket.connect(endpoint);
cout << "connection accepted" << endl;
try
{
while (true)
{
boost::system::error_code ec;
boost::asio::socket_base::bytes_readable command(true);
mysocket.io_control(command);
std::size_t bytes_readable = command.get();
mysocket.async_read_some(boost::asio::buffer(buf),
&handle_response);
io_service.run();
}
} catch (exception &e)
{
cerr << e.what() << endl; //"The parameter is incorrect" exception
}
}
如果从该行删除注释//计算<<bytes_transferred & lt; & lt;' ';在句柄响应函数中,您可以获得较低的CPU使用率,我猜是因为写入屏幕的延迟。
您没有检查错误。如果出现了失败,那么无论如何都要继续阅读,这可能会立即发回带有失败的完成,如此往复。
相关文章:
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- C++两个源文件之间共享的枚举的静态实例
- 堆栈分配的类类型.为什么两个 ID 实例的地址相同?
- 比较两个 std::chrono::time_point 实例时出错
- 在两个类实例之间共享向量
- 编译时检查是否有两个具有相同模板参数的模板实例化
- 使用模板检查我的类的两个实例是否相等
- 如何将一个类的两个单独实例设置为彼此相等的 c++
- 如何在彼此中使用两个类的实例
- 尝试使用两个单独的 getline() 实例来填充两个单独的向量
- 没有成员作为唯一标识符的两个类实例的比较
- 随机洗牌似乎会产生相同的结果,但仅在前两个实例中产生相同的结果.我如何避免这种情况
- 使用Qt的两个"QLowEnergyController"实例连接到两个BLE设备
- 运算符*=来自两个实例(矩阵),结果不好
- 在抛出 std::bad_alloc 实例后终止调用.使用两个类,一个带有指向另一个的指针
- 如何超载分配运算符,该操作员总计两个实例变量
- 如何在c++中的两个函数中传递对象的同一实例
- 如何使用两个实例中的值进行计算
- 两个未初始化的实例之一
- 我可以在两个不同的类实例中使用boost asio套接字引用吗