随笔分类 -  并发编程

摘要:template class threadsafe_queue { private: mutable std::mutex mut; std::queue data_queue; std::condition_variable data_cond; public: threadsafe_queue() {} void push(T new_value) { std::loc... 阅读全文
posted @ 2019-03-06 09:04 KeepInYourMind 阅读(291) 评论(0) 推荐(0) 编辑
摘要:序列化(serialization):多个线程轮流存取互斥元保护的数据,它们必须线性的而非并发的存取数据。 如何使得数据结构线程安全的基本原理: 保证当数据结构不变性被别的线程破坏时的状态不被任何别的线程看到。 注意避免数据结构接口所固有的竞争现象,通过为完整操作提供函数,而不是提供操作步骤。 注意 阅读全文
posted @ 2019-03-06 09:02 KeepInYourMind 阅读(213) 评论(0) 推荐(0) 编辑
摘要:c++11中增加了线程,使得我们可以非常方便的创建线程,它的基本用法是这样的: 但是线程毕竟是属于比较低层次的东西,有时候使用有些不便,比如我希望获取线程函数的返回结果的时候,我就不能直接通过thread.join()得到结果,这时就必须定义一个变量,在线程函数中去给这个变量赋值,然后join,最后 阅读全文
posted @ 2018-08-23 10:44 KeepInYourMind 阅读(878) 评论(0) 推荐(0) 编辑
摘要:简单地说,std::future 可以用来获取异步任务的结果,因此可以把它当成一种简单的线程间同步的手段。std::future 通常由某个 Provider 创建,你可以把 Provider 想象成一个异步任务的提供者,Provider 在某个线程中设置共享状态的值,与该共享状态相关联的 std: 阅读全文
posted @ 2018-08-23 10:33 KeepInYourMind 阅读(5615) 评论(0) 推荐(0) 编辑
摘要:1. 当把函数对象传入到线程构造函数中时,需要避免“最令人头痛的语法解析”。如果传递了一个临时变量,而不是一个命名的变量;C++编译器会将其解析为函数声明,而不是类型对象的定义。 例如: ???这里相当与声明了一个名为my_thread的函数,这个函数带有一个参数(函数指针指向没有参数并返回back 阅读全文
posted @ 2018-08-15 12:56 KeepInYourMind 阅读(814) 评论(0) 推荐(0) 编辑
摘要:原子(atomic)本意是”不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作”. (1) 使用总线锁保证原子性 如果多个处理器同时对共享变量进行读写操作,那么共享变量就会被多个处理器同时进行操作,这样读写操作就不是原子的,操作完之后共享变 阅读全文
posted @ 2018-06-11 14:48 KeepInYourMind 阅读(5348) 评论(0) 推荐(1) 编辑
摘要:lock_guard boost::mutex mutex; boost::lock_guard<boost::mutex> lock(mutex); boost::mutex mutex; boost::lock_guard<boost::mutex> lock(mutex); boost::mu 阅读全文
posted @ 2018-06-11 14:42 KeepInYourMind 阅读(4231) 评论(0) 推荐(0) 编辑
摘要:1. 多个线程访问同一资源时,为了保证数据的一致性,最简单的方式就是使用 mutex(互斥锁)。 引用 cppreference 的介绍: 方法1:直接操作 mutex,即直接调用 mutex 的 lock / unlock 函数此例顺带使用了 boost::thread_group 来创建一组线程 阅读全文
posted @ 2018-06-11 14:39 KeepInYourMind 阅读(66447) 评论(0) 推荐(1) 编辑
摘要:什么是线程的同步与互斥? 互斥:指在某一时刻指允许一个进程运行其中的程序片,具有排他性和唯一性。 对于线程A和线程B来讲,在同一时刻,只允许一个线程对临界资源进行操作,即当A进入临界区对资源操作时,B就必须等待;当A执行完,退出临界区后,B才能对临界资源进行操作。 同步:指的是在互斥的基础上,实现进 阅读全文
posted @ 2018-06-11 14:22 KeepInYourMind 阅读(962) 评论(0) 推荐(0) 编辑
摘要:以boost为例。boost::thread有两个构造函数: (1)thread():构造一个表示当前执行线程的线程对象; (2)explicit thread(const boost::function0<void>& threadfunc): boost::function0<void>可以简单 阅读全文
posted @ 2018-06-11 13:09 KeepInYourMind 阅读(2476) 评论(0) 推荐(0) 编辑
摘要:thread::join(): 阻塞当前线程,直至 *this 所标识的线程完成其执行。*this 所标识的线程的完成同步于从 join() 的成功返回。 该方法简单暴力,主线程等待子进程期间什么都不能做。thread::join()会清理子线程相关的内存空间,此后thread object将不再和 阅读全文
posted @ 2018-06-11 12:37 KeepInYourMind 阅读(41181) 评论(0) 推荐(1) 编辑
摘要:条件变量(Condition Variable)的一般用法是:线程 A 等待某个条件并挂起,直到线程 B 设置了这个条件,并通知条件变量,然后线程 A 被唤醒。经典的「生产者-消费者」问题就可以用条件变量来解决。 这里等待的线程可以是多个,通知线程可以选择一次通知一个(notify_one)或一次通 阅读全文
posted @ 2018-06-11 11:02 KeepInYourMind 阅读(1003) 评论(0) 推荐(0) 编辑
摘要:进程与线程 进程:是操作系统结构的基础;是一个正在执行的程序;计算机中正在运行的程序实例;可以分配给处理器并由处理器执行的一个实体;由单一顺序的执行显示,一个当前状态和一组相关的系统资源所描述的活动单元。 进程的概念主要有两点: 第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括 阅读全文
posted @ 2017-05-26 16:43 KeepInYourMind 阅读(314) 评论(0) 推荐(0) 编辑