网站开发大约多少钱网页版云游戏

当前位置: 首页 > news >正文

网站开发大约多少钱,网页版云游戏,手机ftp传网站文件,wordpress积分与奖励1. 简述 在多线程或其他许多场景下#xff0c;同时对一个变量或一段资源进行读写操作是一个比较常见的过程#xff0c;保证数据的一致性和防止竞态条件至关重要。 C的标准库中为我们提供了使用的互斥及锁对象#xff0c;帮助我们实现资源的互斥操作。 2. std::mutex及其衍…1. 简述 在多线程或其他许多场景下同时对一个变量或一段资源进行读写操作是一个比较常见的过程保证数据的一致性和防止竞态条件至关重要。 C的标准库中为我们提供了使用的互斥及锁对象帮助我们实现资源的互斥操作。 2. std::mutex及其衍生互斥手段 1互斥类 std::mutex最基本的 mutex 类。 std::recursive_mutex递归 mutex 类。 std::time_mutex定时 mutex 类。 std::recursive_timed_mutex定时递归 mutex 类。 2RAII上锁 std::lock_guard与 Mutex RAII 相关方便线程对互斥量上锁。 std::unique_lock与 Mutex RAII 相关方便线程对互斥量上锁但提供了更好的上锁和解锁控制。 3API std::try_lock尝试上锁。如果当前互斥量已经被其他线程占用当前线程不会阻塞而是立即返回false。如果当前互斥量没有被其他线程占用当前线程会获得该互斥量完成上锁。需要注意的是如果当前线程已经获得了该互斥量那么再次进行try_lock就会造成死锁。 std::lock上锁。调用该API会将互斥两上锁如果当前互斥量已经被其他线程占用则会阻塞知道当前线程获得该锁。 std::unlock解锁。 std::call_once如果多个线程需要同时调用某个函数call_once 可以保证多个线程对该函数只调用一次。 3. std::mutex使用 std::mutex是最简单的互斥量可以单独使用为资源创建互斥环境也可以与std::lock_guard合起来使用实现一个RAII的应用。 需要注意的是std::mutex仅支持一次加锁和解锁。如下是一个简单地小程序。 /** 引用头文件. */#include mutex/** 创建互斥量. */std::mutex mtx;/** 需要共享的某个资源 */int sharedResource;/** 操作上述共享资源的函数 */void accessResource() {/** 尝试加锁 */mtx.lock();/** 临界区开始 - 访问共享资源 */sharedResource 1;/** 临界区结束 - 释放锁 */mtx.unlock();} 接下来是一个配合lock_guard使用的例程。 /** 引用头文件. */#include mutex/** 创建互斥量. */std::mutex mtx;/** 需要共享的某个资源 */int sharedResource;/** 操作上述共享资源的函数 */void accessResource() {/** 尝试加锁 */std::lock_guardstd::mutex guard(mtx); // 自动加锁/** 临界区开始 - 访问共享资源 */sharedResource 1;/** 退出函数自动释放. */} 4. std::recursive_mutex递归锁 从名字可以看出递归所是可以多次上锁的当然也需要配合多次解锁通常情况下也仅用在递归环境下。 如下是简单的使用std::recursive_mutex的示例。 #include iostream#include thread#include mutexstd::recursive_mutex mtx;void func(int n) {mtx.lock();std::cout Thread n locked the mutex std::endl;if (n 1) {func(n - 1);}std::cout Thread n unlocked the mutex std::endl;mtx.unlock();}int main() {std::thread t1(func, 3);std::thread t2(func, 2);t1.join();t2.join();return 0;} 如下是配合lock_guard使用的示例。 #include iostream#include thread#include mutexstd::recursive_mutex mtx;void func(int n) {std::lock_guardstd::recursive_mutex guard(mtx);std::cout Thread n locked the mutex std::endl;if (n 1) {func(n - 1);}std::cout Thread n unlocked the mutex std::endl;}int main() {std::thread t1(func, 3);std::thread t2(func, 2);t1.join();t2.join();return 0;} 5. std::timed_mutex std::timed_mutex 类似于 std::mutex也是一个较为简单的锁。但是它额外提供了两个接口分别是 try_lock_for() 和 try_lock_until() 成员函数。前者允许线程尝试在一段时间内获取锁如果在指定的时间内未能获得锁线程将返回失败并且可以根据返回值来判断是否继续等待或者执行其他逻辑。后者是一个确定的时间点当到达指定的时间点以后互斥锁不能够使用则返回。 使用 std::timed_mutex 可以帮助避免线程因为获取锁时长时间阻塞而导致程序性能下降或死锁情况的发生。 6. std::lock_guard和std::unique_lock std::lock_guard 和 std::unique_lock 都是 C 标准库中用于管理互斥量mutex的 RAIIResource Acquisition Is Initialization资源获取即初始化包装器。它们都可以确保在持有互斥量的作用域内互斥量会被安全地锁定和解锁从而避免死锁和其他并发问题。不过std::unique_lock 比 std::lock_guard 提供了更多的灵活性和功能。下面是它们的一些主要区别以及使用示例。 我们在前面第3节和第4节都列举了使用lock_guard的使用lock_guard的优点是使用简单缺点是过于简单了。 unique_lock能够实现和lock_guard一样的动能也提供了更灵活的上锁和解锁控制。 unique_lock含有第二参数如下所示 std::adopt_lock 表示这个互斥量已经被lock了你必须要把互斥量提前lock了否则会报异常。std::adopt_lock标记的效果就是假设调用一方已经拥有了互斥量的所有权也就是已经lock成功了通知lock_guard和unique_lock不需要 再构造函数中lock这个互斥量了。 std::try_to_lock我们会尝试用mutex的lock()去锁定这个mutex但是如果没有锁定成功也会立即返回并不会阻塞在那里使用这个try_to_lock的前提是你自己不能先lock。 std::defer_lock:不给mutex加锁初始化了一个没有加锁的mutex。 前面讲到unique_lock比lock_guard更为灵活体现在哪里呢事实上unique_lock还拥有自己的成员函数我们可以灵活的调用它的成员函数进行加解锁而不是依赖于RAII。 unique_lock的成员函数如下。 lock调用所管理的mutex对象的lock函数 try_lock调用所管理的mutex对象的try_lock函数 try_lock_for调用所管理的mutex对象的try_lock_for函数 try_lock_until调用所管理的mutex对象的try_lock_until函数 unlock调用所管理的mutex对象的unlock函数 release 返回所管理的mutex对象的指针并释放所有权但不改变mutex对象的状态 owns_lock返回当前std::unique_lock对象是否获得了锁 mutex返回当前std::unique_lock对象所管理的mutex对象的指针 swap交换两个unique_lock对象