当前位置:首页 > C++ boost库总结
mu1.unlock(); // 逐个解锁 mu2.unlock();
9. 多线程仅执行一次初始化需要使用一个once_flag对象,并把它初始化为
BOOST_ONCE_INIT,然后使用call_once()来调用初始化函数,完成仅执行一次的初始化
once_flag of = BOOST_ONCE_INIT; // 一次初始化标志
void call_func() { call_once(of, init_count); } // 执行一次初始化 int main() {
(thread(call_func)); // 必须用括号括住临时对象,否则编译器会认为这是个空thread对象声明 (thread(call_func));
this_thead::sleep(posix_time::seconds(1)); // 等待1秒钟 }
10. barrier(护栏)可用于多个线程同步,当线程执行到barrier时必须等待,直到所
有的线程都达到这个点时才能继续执行。
11. thread_specific_ptr实现可移植的线程本地存储机制(thread local storage,
TLS)或线程专有存储(thread specific storage, TSS),可以简化多线程应用,提高性能
void printing() {
thread_specific_ptr
++(*pi); // 递增
mutex::scoped_lock lock(io_mu); // 锁定io流操作 cout << \}
12. this_thread名字空间下提供了at_thread_exit(func),允许注册一个线程结束回
调,无论线程是否被中断。但线程意外终止的情况下,该回调不会被执行
13. promise和packaged_task都支持回调函数,可以让future延后在需要的时候
获得值,而不必主动启动线程计算
14. asio库基于OS提供的异步机制,采用前摄器设计模式(Proactor)实现了可移植
的异步或同步IO操作,而且并不要求使用多线程和锁。目前asio主要关注与网络通信方面,支持TCP、ICMP、UDP等网络通信协议,还支持串口读写、定时器、SSL等功能。asio是一个很好的富有弹性的框架,可以扩展到其他有异步操作需要的领域。
15. asio库基于前摄器模式(Proactor)封装了OS的select、poll/epoll、kqueue、
overlapped I/O等机制,实现了异步IO模型。它的核心类是io_service,相当于前摄器模式中的Proactor角色,asio的任何操作都需要有io_service的参数与。
1. 在同步模式下,程序发起一个IO操作,向io_service提交请求,io_service
把操作转交给OS,同步的等待。当IO操作完成时,OS通知io_service,然后io_service再把结果发回给程序,完成整个同步流程。
2. 异步模式下,程序出了要发起IO操作,还要定义一个用于回调的完成处理
函数。io_service同样把IO操作转交给操作系统执行,但它不同步等待,而是立即返回。调用io_service的run()成员函数可以等待异步操作完成,当异步操作完成时io_service从OS获取操作结果,调用完成处理函数
3. asio不直接使用OS提供的线程,而是定义了strand以保证在多线程环境
中无需使用互斥量。io_service::strand::wrap()可以包装一个函数在strand中执行
4. asio提供了mutable_buffer和const_buffer两种可安全用于异步读写的
缓冲区
1. ip::address表示IP地址,可以同时支持ipv4和ipv6两种地址 2. ip::tcp::endpoint表示ip地址和端口号 3. 同步socket示例:
1. Server:
int main() { try {
cout << \
io_service ios; // asio程序必需的io_service对象
ip::tcp::acceptor acceptor(ios, ip::tcp::endpoint(ip::tcp::v4(), 6688);
cout << acceptor.local_endpoint().address() << end; while(true) {
ip::tcp::socket sock(ios);
acceptor.accept(sock); // 阻塞等待socket连接
cout << \ sock.write_some(buffer(\发送数据。不能直接把数组、vector等容器用做asio的读写参数,必须通过buffer()函数包装 } }
catch(std::exception& e) { cout << e.what() << endl; } }
2. Client:
void client(io_service& ios) { try {
cout << \
ip::tcp::socket sock(ios); // 创建socket对象
ip::tcp::endpoint ep(ip::address::from_string(\6688); // 创建连接端点 sock.connect(ep);
vector
sock.read_some(buffer(str)); // 使用buffer包装缓冲区接收数据 cout << \<< &str[0] << endl; }
共分享92篇相关文档