Boost.Thread.Synchronization

2023-10-28 20:08

本文主要是介绍Boost.Thread.Synchronization,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Boost.Thread.Synchronization

Boost 中,可以使用互斥(mutex)变量来进行同步, 通过锁(Lock)操作来获得mutex的所有权,通过解锁(Unlock)操作来让出所有权,而条件变量(condition_variable)则提供了一种机制用于一个线程等待另一个线程通知某个特定条件的状态变为真。

1. Mutex

Boost提供了recursive/non-recursive mutex(支持排他访问),  以及shared mutex(支持共享访问).

recursive mutex:  lock后,unlock之前,可再次lock.

non-recursive mutex: lock后,unlock之前,不可再次lock.

shared mutex: 可被多个访问者lock.

Mutex可以实现以下几种属性: 可加锁(排他访问)、加锁可超时、可被多个访问者加锁(共享访问)、加锁者可权限升级(将共享访问提升为排他访问)。

The Lockable concept models exclusive ownership.

The TimedLockable concept refines theLockable concept to add support for timeouts when trying to acquire the lock.

The SharedLockable concept is a refinement of theTimedLockable concept that allows forshared ownership as well asexclusive ownership

The UpgradeLockable concept is a refinement of theSharedLockable concept that allows forupgradable ownership as well asshared ownership andexclusive ownership.

2. Mutex对象

#include <boost/thread/mutex.hpp>
#include <boost/thread/shared_mutex.hpp>

...

boost::mutex 支持排他访问的互斥对象。

boost::try_mutex 等同于 boost::mutex, 用来兼容以前的版本。

boost::timed_mutex 支持超时的排他互斥对象。

boost::recursive_mutex 支持递归加锁的排他互斥对象。

boost::recursive_timed_mutex 支持递归和超时的排他互斥对象。

boost::shared_mutex 可共享的互斥对象。

3. Lock对象

<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">thread</span><span class="special">/</span><span class="identifier">locks</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>

boost::lock_guard 是最简单的锁,构造时对传入的mutex加锁,析构时解锁。

boost::unique_lock  可以推迟lock(构造时指定defer_lock_t参数), 通过调用加锁函数显示lock: lock(), try_lock(), time_lock(), 可以调用unlock()解锁,或unique_lock对象析构时自动解锁。

boost::shared_lock  类似于unique_lock, 不同的是获得的是共享访问权限(前面获得的都是排他权限)。

boost::upgrade_lock  获得可升级的访问权限。

boost::upgrade_to_unique_lock 提升upgrade_lock权限,析构时upgrade_lock权限降级。

 <span class="keyword">explicit</span> <span class="identifier">upgrade_to_unique_lock</span><span class="special">(</span><span class="identifier">upgrade_lock</span><span class="special"><</span><span class="identifier">Lockable</span><span class="special">>&</span> <span class="identifier">m_</span><span class="special">);</span>

4. Lock函数(全局函数)

lock(Lockable1,Lockable2,...)

lock(begin,end) // 将lockable对象(mutex)放到一个容器中

try_lock(Lockable1,Lockable2,...)

try_lock(begin,end)

用来对多个顺序不确定的mutex同时加锁,以避免死锁。

5. 条件变量 condition_variable

提供机制实现一个线程某个条件等待来自另一个线程的通知。

Notice that the lock is passed towait():wait will atomically add the thread to the set of threads waiting on the condition variable, and unlock the mutex.

boost::condition_variable

boost::condition_variable_any

通常的用法示例如下:

[cpp] view plain copy
  1. #include <boost/thread/condition_variable.hpp>  
  2.   
  3. boost::condition_variable cond;  
  4. boost::mutex mut;  
  5. bool data_ready;  
  6.   
  7. void process_data();  
  8.   
  9. void wait_for_data_to_process()  
  10. {  
  11.     boost::unique_lock<boost::mutex> lock(mut);  
  12.     while(!data_ready)  
  13.     {  
  14.         cond.wait(lock);  
  15.     }  
  16.     process_data();  
  17. }  

condition_variable_any is more general, and will work with any kind of lock or mutex, whereas condition_variable requires that the lock passed to wait is an instance of boost::unique_lock<boost::mutex>.

6. Barriers (关卡)

可以使指定数量的线程在某个执行点同步。

[cpp] view plain copy
  1. #include <boost/thread/barrier.hpp>  
  2.   
  3. class barrier  
  4. {  
  5. public:  
  6.     barrier(unsigned int count);  
  7.     ~barrier();  
  8.   
  9.     bool wait();  
  10. };  

7.  Futures
用于同步未来的数据,这些数据可能被一个或多个线程产生。

这篇关于Boost.Thread.Synchronization的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/295630

相关文章

Thread如何划分为Warp?

1 .Thread如何划分为Warp? https://jielahou.com/code/cuda/thread-to-warp.html  Thread Index和Thread ID之间有什么关系呢?(线程架构参考这里:CUDA C++ Programming Guide (nvidia.com)open in new window) 1维的Thread Index,其Thread

Boost程序库入门学习

优秀的程序员要能够知其所以然,而不是重复的造轮子,近期目标是学习优秀的第三方库,同时尝试使用C++11/14新特性,然后吸取精华用到项目中去,加油~ 参考书籍: 罗剑锋写的《Boost程序库完全开发指南》和《Boost程序库探秘》,前者是一个大体的介绍,后者是针对一些诸如模板元编程等高级特性做了深入的探讨。 一、Boost库概述 Boost是一个功能强大、构造精巧、跨平台、开源并且完全

RT-Thread(Nano版本)的快速移植(基于NUCLEO-F446RE)

目录 概述 1 RT-Thread 1.1 RT-Thread的版本  1.2 认识Nano版本 2 STM32F446U上移植RT-Thread  2.1 STM32Cube创建工程 2.2 移植RT-Thread 2.2.1 安装RT-Thread Packet  2.2.2 加载RT-Thread 2.2.3 匹配相关接口 2.2.3.1 初次编译代码  2.2.3.

GTK中创建线程函数g_thread_new和g_thread_create的区别

使用GThread函数,需要引用glib.h头文件。 这两个接口的核心区别就是  g_thread_create 是旧的接口,现在已经不使用了,而g_thread_new是新的接口,建议使用。 g_thread_create: g_thread_create has been deprecated since version 2.32 and should not be used in n

Boost库一些概念

Boost库一些概念 回调函数和异步操作的设计优势 在 Boost.Asio 中,异步操作和回调函数的设计有以下几个主要优势:1. 非阻塞 I/O非阻塞: 异步操作不会阻塞线程,允许程序在等待 I/O 操作完成的同时执行其他任务。这提高了程序的响应性和并发处理能力。事件驱动: 通过事件循环和回调函数,程序可以以事件驱动的方式处理 I/O 操作,避免了传统阻塞 I/O 模型中的线程阻塞问题。2.

基于 rt-thread的I2C操作EEPROM(AT24C02)

一、AT24C02 The AT24C01A/02/04/08A/16A provides 1024/2048/4096/8192/16384 bits of serial electrically erasable and programmable read-only memory (EEPROM) organized as 128/256/512/1024/2048 words of 8 b

[项目][CMP][Thread Cache]详细讲解

目录 1.设计&结构2.申请内存3.释放内存4.框架 1.设计&结构 Thread Cache是哈希桶结构,每个桶是一个按桶位置映射大小的内存块对象的自由链表 每个线程都会有一个Thread Cache对象,这样每个线程在这里获取对象和释放对象时是无锁的 TLS – Thread Local Strorage Linux gcc下TLSWindows vs下TLS

线程池工具类——Thread学习笔记

记录一下线程池工具类: /*** 线程池工具类* @author lixiang* @date 2018年10月10日 - 11:10* @history 2018年10月10日 - 11:10 lixiang create.*/public class ThreadPoolHelper {private static final Logger logger = LoggerFactory.g

模拟线程死锁——Thread学习笔记

记录一下之前写过的一段模拟死锁的代码: /*** 模拟死锁** @author lixiang* @date 2018年10月12日 - 9:51* @history 2018年10月12日 - 9:51 lixiang create.*/public class HoldLockDemo {private static Object[] lock = new Object[10];priv

boost.graph之属性

相关宏 BOOST_INSTALL_PROPERTY #define BOOST_INSTALL_PROPERTY(KIND, NAME) \template <> struct property_kind<KIND##_##NAME##_t> { \typedef KIND##_property_tag type; \} 最终形式为 template <> struct proper