Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量、可移植、高效的C应用程序。Boost库可以作为标准C库的后备,通常被称为准标准库,是C标准化进程的重要开发引擎之一。使用Boost库可以加速C应用程序的开发过程,提高代码质量和性能,并且可以适用于多种不同的系统平台和编译器。Boost库已被广泛应用于许多不同领域的C++应用程序开发中,如网络应用程序、图像处理、数值计算、多线程应用程序和文件系统处理等。
C++语言并没有对多线程与网络的良好支持,虽然新的C++标准加入了基本的
thread
库,但是对于并发编程的支持仍然很基础,Boost库提供了数个用于实现高并发与网络相关的开发库这让我们在开发跨平台并发网络应用时能够像Java等语言一样高效开发。
thread库为C++增加了多线程处理能力,其主要提供了清晰的,互斥量,线程,条件变量等,可以很容易的实现多线程应用开发,而且该库是可跨平台的,并且支持
POSIX
和
Windows
线程。
7.1 互斥锁
Boost库中的 boost::mutex 类型表示一个互斥锁。它提供了两个主要函数来控制互斥锁:lock() 和 unlock()。当一个线程想要访问一个共享资源时,它会调用互斥锁的 lock() 函数来获取锁,如果无法获得,线程将最多等待直到锁被释放。在线程访问完共享资源后,它需要调用 unlock() 函数来释放锁,以便其他线程可以获得锁并访问共享资源。
互斥体是用于线程同步的一种手段,其主要用于在多线程环境下,防止多个线程同时操作共享资源,当某线程被锁,其他线程则需要等待它解锁后才能继续访问共享资源。
通常我们会使用Mutex来保护共享资源,防止在多线程环境中数据的不一致性,当一个资源被锁定,其他线程只能阻塞等待释放后才可继续操作。
|
在Boost中创建多线程非常简单,只需要定义一个
MyThread
线程函数,并在主函数中开启线程即可实现。
|
7.2 线程局部存储
有时候函数使用了局部静态变量或全局变量,导致无法用于多线程环境,因为无法保证变量在多线程环境下重入的正确操作。
|
如果本地存储的类型是一个结构体,如下定义了
MyStruct
本地结构体,来实现本地数据累加。
|
7.3 使用线程组
线程组
thread_group
用于管理一组线程,就像线程池一样,其内部使用了
std::list<thread*>
来容纳每个线程对象。
当需要创建新线程时,使用
create_thread()
工厂函数,并通过
bind
绑定传递参数即可实现创建,如下是最简单的线程组创建。
|
我们还可以通过
add_thread
和
remove_thread
将特定的线程对象放入到不同的线程组中,来实现对线程的批量操作。
|
7.4 获取线程返回值
获取线程返回值,需要使用异步的方式得到,Boost中提供了
ASIO
库来实现异步操作,该库采用了前摄器设计模式,实现了可移植的异步IO操作。
首先来简单的看一下,如何使用异步的方式实现创建线程的。
|
当我们需要获取单个线程的返回值时,可以使用
valid()
方法或使用
get()
将返回值从线程里拉取出来。
|
有时候我们会一次性
创建
多个线程共同执行,此时想要获取到
每个线程
中的
返回值
,那么就需要使用多个
future
对象,代码如下。
|
返回数值类型如果不够存储的话,那么我们可以定义一个
MyStruct
结构体,通过结构体传递参数,并将计算结果
返回为结构
体类型。
|
由于
future
只能
get
获取一次数据,使得它不能被多线程并发访问,所以就出现了
shared_future
,它是
future
的增强,可以线程安全的多次调用
get()
获取到计算结果,修改很简单只需要将声明改一下,其他的不用动。
void Async() |
7.5 共享锁
该锁允许线程获取多个共享所有权和一个专享所有权,实现了读写锁机制,即多个读线程一个写线程。
|
7.6 获取线程ID号
实现线程池,每次将一个线程
service_io
存入到栈中,需要时从栈中弹出并调用内部相应的函数。
|