boost常用库的使用总结

xiaoxiao2021-02-28  33

一、多线程: 1、thread库相关的,c++多线程是一个复杂的事情,windows MFC提供了CWinThread类,WaitForSingleObject等待回收线程; Linux系统提供了createThread,thread join来回收线程。 boost::thread就比较方便了: 1)、boost::thread(boost::bind(&class::func,this)).detach()。thread()启动一个线程,bind线程绑定的 需要执行的任务接一个函数指针,detach,父线程不需要管子线程的回收。 2)、boost::thread thd1(func());参数是一个函数调用       thd1.join();父线程来进行回收。 2、线程同步用互斥量boost::mutex,锁用boost::mutex::scoped_lock,来进行时序控制。 比如boost::mutex::scoped_lock lock(m_mutex);互斥量相当于是钥匙,lock相当于是锁,当获取这个钥匙的锁生命周期结束后,则钥匙释放。 mutex可以看成是通配的钥匙。 还有一种是AutoLock<ThreadMutexLock> lock (&_operMutex); 二、网络编程: 网络编程分为同步模式和异步模式,同步模式是有一个数据块客户端发送过来,服务端就必须处理完才能处理下一个数据块。 异步模式是客户端发送的数据块放入缓存队列,异步处理不阻塞,同步模式是阻塞式的。 1、同步模式: 服务端: // 创建服务器对象 boost::asio::io_service ios;#asio编程必须的io_service对象,服务端和客户端创建socket和服务端创建acceptor对象要用 boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(),9800);#tcp协议的服务器所在的ip和网络编程开放的端口,客户端连接的ip和端口 boost::asio::ip::tcp::acceptor acceptor(ios,ep); // 监听连接 while(1){      boost::asio::ip::tcp::socket sock(ios);#创建socket连接对象      acceptor.accept(sock);      cont<<sock.remote_endpoint().address()<<endl;

     boost::thread(boost::bind(svr_handle,sock)).detach(); } //交互处理

void svr_handle(boost::asio::ip::tcp::socket sock)

{       string msg;       sock.write_some(boost::asio::buffer("hello world"));       char msg[1024];       sock.read_some(boost::asio::buffer(msg));       cout<<"client send msg:"<<msg<<endl;

} 客户端: // 创建客户端对象 boost::asio::io_service ios;#asio编程必须的io_service对象 boost::asio::ip::tcp::endpoint ep("127.0.0.1",9800); //监听连接 std::shared_ptr<boost::asio::ip::tcp::socket> p_sock(ios);#创建socket连接对象 p_sock->connect(ep); string msg; p_sock->write_some(boost::asio::buffer(msg)); char buf[1024]; p_sock->read_some(boost::asio::buffer(buf));2、异步模式 服务端: 监听由同步模式的accept()变成了async_accept(); 读写由同步模式的write_some()、read_some()变成了async_write_some()、async_read_some() 异步模式关键是void Server::run(){ios.run();//io_service的run方法异步处理队列}。

boost::asio::io_service ios;

boost::asio::ip::tcp::endpoint ep(boost::asio::ip::tcp::v4(),9800);

shared_ptr<boost::asio::ip::tcp::socket> s_ptr(new boost::asio::ip::tcp::socket(ios));

boost::asio::ip::tcp::acceptor acc(ios,ep);

start_accept();

ios.run();

void start_accept()

{acc.async_accept(*s_ptr,boost::bind(handle_accept,s_ptr,1));}

void handle_accept(shared_ptr<boost::asio::ip::tcp::socket> s_ptr,boost::system::error_code ec)

{

    if(err) return ;

    socket_ptr sock(new ip::tcp::socket(service));

    start_accept(sock);

}

当接收到客户端连接的时候,handle_accept被调用。当连接之后socket则就能使用了。

客户端: 连接由同步模式的connect()变成了async_connect(); 读写由同步模式的write_some()、read_some()变成了async_write_some()、async_read_some() 异步模式关键是void Client::run(){ios.run();//io_service的run方法异步处理队列}。

boost::asio::io_service ios;

boost::asio::ip::tcp::endpoint ep("127.0.0.1",9800); //监听连接 std::shared_ptr<boost::asio::ip::tcp::socket> p_sock(ios);#创建socket连接对象

p_sock->async_connect(ep,handle_connect);

ios.run();

void handle_connect(const boost::system::error_code ec)

{//如果ec返回成功了,就知道连接是成功的了}

当handle_connect连接上了,则ios.run()就会循环退出。三、文件系统: 文件系统相关的方法一般都在boost::filesystem命名空间中。 boost::filesystem::path filepath(path); filepath.parent_path();//获取父路径 filepath.filename();//包括文件扩展名 boost::filesystem::file_size(filepath);//获取文件大小,单位是字节 boost::filesystem::is_regular_file(path);//判断是否是普通文件 boost::filesystem::is_directory(path);//判断是否是目录 boost::filesystem::is_symlink(path);//判断是否是链接文件

转载请注明原文地址: https://www.6miu.com/read-2625090.html

最新回复(0)