
多线程
Jimmy1224
这个作者很懒,什么都没留下…
展开
-
多线程的互斥锁应用RAII机制
什么是RAII机制RAII是Resource Acquisition Is Initialization(翻译成 “资源获取即初始化”)的简称,是C++语言的一种管理资源、避免资源泄漏的惯用法,该方法依赖构造函数资和析构函数的执行机制。RAII的做法是使用一个类对象,在对象的构造函数中获取资源,在对象生命期内控制对资源的访问,最后在对象消失时,其析构函数来释放获取的资源;这里的资源可以是文件句柄,内存,Event,互斥量等等,由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭原创 2020-07-22 20:01:40 · 1369 阅读 · 0 评论 -
C++11向线程函数传递参数
template< class Function, class... Args > explicit thread( Function&& f, Args&&... args );这个是std::thread构造函数之一,其中f是可调用对象,args是传递给f的参数。默认传递给f的是按值复制,若需要传递引用参数给线程函数,则必须包装它(例如用 s...原创 2019-04-20 17:26:05 · 9356 阅读 · 6 评论 -
C++11中线程所有权转移分析
移动特性说明C++标准库中有很多资源占有(resource-owning)类型,比如std::ifstream,std::unique_ptr还有std::thread都是可移动,但不可拷贝。移动拷贝或者移动赋值都使得原有对象对所属资源的控制权发生转移,从对象A转移到对象B,对资源的控制只在对象B中保留。以下是std::thread线程类的移动特性的声明,支持移动构造和移动对象,但不可拷贝。...原创 2019-04-21 00:52:59 · 1868 阅读 · 0 评论 -
C++11使用互斥量保护共享数据
C++中通过实例化std::mutex创建互斥量,通过调用成员函数lock()进行上锁,unlock()进行解锁。不过,不推荐实践中直接去调用成员函数,因为调用成员函数就意味着,必须记住在每个函数出口都要去调用unlock(),也包括异常的情况。C++标准库为互斥量提供了一个RAII语法的模板类std::lock_guard,其会在构造的时候提供已锁的互斥量,并在析构的时候进行解锁,从而保证了一个...原创 2019-04-27 00:38:34 · 2531 阅读 · 0 评论 -
C++11条件变量使用详解
condition_variable介绍在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。其主要成员函数如下:条件变量是利用线程间共享的全局变量进行同步的一种机制,主要包括两个动作:一个线程因等待"条件变量的条件成立"而挂起;另外一个线程使"条件成立",给出信...原创 2019-05-02 00:31:21 · 43723 阅读 · 27 评论 -
C++11保护共享数据的其他方法
保护共享数据的初始化过程在多线程编程中,互斥量是最通用的保护共享数据的机制。但是在某些情况下,一些资源仅需要在第一次初始化的时候需要保护,其时候就可以不需要互斥变量的保护了。比如编码中最常见的单例模式,核心代码如下://(3)获得本类实例的唯一全局访问点static CSinglton* GetInstance(){ //若实例不存在,则创建实例对象 if (NULL ==...原创 2019-04-27 17:44:00 · 730 阅读 · 0 评论 -
C++11之std::future对象使用说明
std::future介绍在前面几篇文章中基本都用到thread对象,它是C++11中提供异步创建多线程的工具。但是我们想要从线程中返回异步任务结果,一般需要依靠全局变量;从安全角度看,有些不妥;为此C++11提供了std::future类模板,future对象提供访问异步操作结果的机制。std::future类模板定义头文件<future>,其函数声明如下:template&l...原创 2019-05-02 23:07:53 · 69835 阅读 · 5 评论 -
C++11线程管理基础
1. 启动线程在C++ 11中线程是在std::thread对象创建时启动。因为我们把启动线程的重心放在如何构造这个thread对象,其构造函数有以下几个://仅仅是构造一个线程类,但没有和具体化的线程函数关联thread() noexcept;// 移动构造函数thread( thread&& other ) noexcept;//构造新的 std::thread 对...原创 2019-04-20 14:32:27 · 936 阅读 · 0 评论 -
C++11之std::async使用介绍
在C++11中有个async异步函数,其声明如下:template <class Fn, class... Args>future<typename result_of<Fn(Args...)>::type> async (launch policy, Fn&& fn, Args&&... args);该模板函数...原创 2018-03-10 12:55:00 · 10754 阅读 · 2 评论 -
C++11之std::promise使用介绍
在C++11中有个future头文件,在这个头文件有一个promise类模板,std::promise 提供存储值或异常的设施,之后通过 std::promise 对象所创建的 std::future 对象异步获得结果。其模板声明如下:template< class R > class promise;1) //空模板template< class R > ...原创 2018-03-13 10:55:05 · 4753 阅读 · 0 评论 -
C++读写锁特性说明
读写问题假设某个数据对象是释若干进程共享的,这些进程的某些只会读这种共享对象的内容,另一些则只会更新这种共享对象数据。可以把这些进程分为两类,一类负责读取数据对象,称为读者进程,另一类负责更新共享数据,称为写者进程。多个读者可以同时获取共享对象,但是当一个写者和另外一个读者(或者写者)同时存取对象时,就会发生混乱。为了避免发生混乱现象,要求写者进程互斥地存取共享对象,这类同步问题就称为读写问...原创 2019-05-20 22:26:30 · 2610 阅读 · 0 评论 -
多线程google面试题
有四个线程1、2、3、4。线程1的功能就是输出1,线程2的功能就是输出2,以此类推…现在有四个文件ABCD。初始都为空。现要让四个文件呈如下格式:A:1 2 3 4 1 2…B:2 3 4 1 2 3…C:3 4 1 2 3 4…D:4 1 2 3 4 1…问题分析:由于每个线程都固定输出一个字符,这个是不会发生变化的,要想达到预期效果,只能是每次循环向不同的文件写字符。这里考察的是线...原创 2019-05-26 14:31:48 · 528 阅读 · 0 评论 -
WaitForMultipleObjects等待多对象用法说明
引言在window c++编程中,为了等待线程结束或者同步对象有限号,我们常常使用WaitForSingleObjectAPI函数,从字面上就可以看出,该接口是用于等待单个对象。而实际编码中,我们会遇到需要等待多个对象同时符合条件或者多个对象中的一个符合条件就执行某个事件,而本文讨论的WaitForMultipleObjectsAPI就可以满足同时监控多个对象的需求。为了对比它们的差异点,下面分...原创 2019-07-14 14:42:00 · 4892 阅读 · 0 评论 -
_beginthreadex 创建多线程解读
一、解释(1)如果你正在编写C/C++代码,决不应该调用CreateThread。相反,应该使用VisualC++运行期库函数_beginthreadex,退出也应该使用_endthreadex。如果不使用Microsoft的VisualC++编译器,你的编译器供应商有它自己的CreateThread替代函数。不管这个替代函数是什么,你都必须使用。(2)因为_beginthreadex和_en...转载 2019-02-18 23:20:46 · 1291 阅读 · 0 评论 -
C/C++线程退出的四种方法
想要终止线程的运行,可以使用以下方法:线程函数返回(最好使用该方法)。同一个进程或另一个进程中的线程调用TerminateThread函数(应避免使用该方法)。通过调用ExitThread函数,线程将自行撤消(最好不使用该方法)。ExitProcess和TerminateProcess函数也可以用来终止线程的运行(应避免使用该方法)。下面将详细介绍终止线程运行的方法:1-4,并说明线...原创 2019-02-14 22:52:32 · 56461 阅读 · 0 评论 -
C++11之packaged_task使用介绍
介绍packaged_task类模板也是定义于future头文件中,它包装任何可调用 (Callable) 目标,包括函数、 lambda 表达式、 bind 表达式或其他函数对象,使得能异步调用它,其返回值或所抛异常被存储于能通过 std::future 对象访问的共享状态中。简言之,将一个普通的可调用函数对象转换为异步执行的任务。模板声明如下:template< class ...原创 2019-05-02 23:46:49 · 9357 阅读 · 3 评论 -
利用互斥对象实现线程同步的实例说明
多线程编程中,如果我们稍有不注意,很容易出现一些意想不到的结果,主要原因就是多线程的同步处理;我们需要保证多个线程在共同运行时,进行对应资源的同步处理,保证一个线程访问共享资源时,其他线程不能访问该资源,这里将使用互斥对象实现线程同步;在“认识多线程”这篇文章中有个实例2,该实例给出了两个线程共同完成g_Index的计数,并打印对应的线程标识;最终的运行结果存在不符合预期的地方;原因就是...原创 2017-01-13 22:17:43 · 1319 阅读 · 0 评论 -
利用事件对象实现线程同步
本文利用事件对象解决多线程计数问题和打印问题,问题描述见认识多线程-实例2事件对象介绍事件对象和互斥量属于内核对象,它包含三个成员: 1. 使用计数; 2. 用于指明该事件是一个自动重置事件还是一个人工重置事件的布尔值; 3. 用于指明该事件处于已通知状态还是未通知状态的布尔值; 事件对象API1. 创建事件对象 - CreateEvent通过CreateEvent函数创建或者原创 2017-04-10 22:42:46 · 1081 阅读 · 0 评论 -
经典线程同步总结 关键段 事件 互斥量 信号量
前面《秒杀多线程第四篇一个经典的多线程同步问题》提出了一个经典的多线程同步互斥问题,这个问题包括了主线程与子线程的同步,子线程间的互斥,是一道非常经典的多线程同步互斥问题范例,后面分别用了四篇《秒杀多线程第五篇经典线程同步关键段CS》《秒杀多线程第六篇经典线程同步事件Event》《秒杀多线程第七篇经典线程同步互斥量Mutex》《秒杀多线程第八篇经典线程同步信号量Se转载 2017-05-24 20:42:59 · 651 阅读 · 1 评论 -
利用关键代码段实现线程同步
关键代码段关键代码段,也叫做临界区,它是指包含共享资源的一小段代码,这段代码被执行前需要得到访问权才能被执行,否则会一直等到;相关API初始化关键代码段对象void WINAPI InitializeCriticalSection( __out LPCRITICAL_SECTION lpCriticalSection);等待关键代码段对象的所有权void WINAPI EnterCr原创 2017-05-14 18:14:23 · 654 阅读 · 0 评论 -
多线程死锁的产生和解决
什么是死锁线程死锁一般是发生在多个线程的多个锁之间,比如线程A拥有临界区对象LockA的所有权,等待临界区对象LockB;线程B拥有临界区对象LockB的所有权,等待临界区对象LockA;由于两个线程间相互等待各自的锁,并且不释放,就会导致程序一直等待下去,发生死锁;死锁伪代码//线程AEnterCriticalSection(&g_csLockA);Sleep(10);EnterCritic原创 2017-05-15 22:56:41 · 9269 阅读 · 1 评论 -
利用信号量实现线程同步
本篇使用信号量机制实现对全局资源的正确使用,包括以下两点:各个子线程对全局资源的互斥使用主线程对子线程的同步信号量简单的说,信号量内核对象,也是多线程同步的一种机制,它可以对资源访问进行计数,包括最大资源计数和当前资源计数,是两个32位的值;另外,计数是以原子访问的方式进行,由操作系统维护;最大资源计数,表示可以控件的最大资源数量当前资源计数,表示当前可用资源的数量信号量的规则:如果当原创 2017-05-21 20:29:16 · 5572 阅读 · 0 评论 -
CreateThread 和_beginthreadex区别
本文将带领你与多线程作第一次亲密接触,并深入分析CreateThread与_beginthreadex的本质区别,相信阅读本文后你能轻松的使用多线程并能流畅准确的回答CreateThread与_beginthreadex到底有什么区别,在实际的编程中到底应该使用CreateThread还是_beginthreadex? 使用多线程其实是非常容易的,下面这个程序的主线程会创建了转载 2017-06-04 15:00:55 · 828 阅读 · 0 评论 -
c++11中thread join和detach的区别
线程状态:在一个线程的生存期内,可以在多种状态之间转换,不同的操作系统可以实现不同的线程模型,定义许多不同的线程状态,每个状态还可以包含多个子状态,但大体来说,如下几种状态是通用的:1)就绪:参与调度,等待被执行,一旦被调度选中,立即开始执行2)运行:占用CPU,正在运行中3)休眠:暂不参与调度,等待特定事件发生4)中止:已经运行完毕,等待回收线程资源线程环境:线程存在转载 2018-02-01 21:53:06 · 17799 阅读 · 2 评论 -
c++11 thread类的简单使用
一个thread对象就代表一个线程执行,当对象创建完成后,线程函数就开始执行,下面这段话是c++11的thread类介绍。An initialized thread object represents an active thread of execution; Such a thread object is joinable, and has a unique thread id.A d原创 2018-02-01 22:47:42 · 1557 阅读 · 0 评论 -
c++11 yield函数的使用
yield函数时c++11的新特性,它在std::this_thread::yield命名空间中实现,函数声明如下:void yield() noexcept; 其作用是当前线程“放弃”执行,让操作系统调度另一线程继续执行比如说你的线程需要等待某个操作完成,如果你直接用一个循环不断判断这个操作是否完成就会使得这个线程占满CPU时间,这会造成资源浪费。这时候你可以判断一次操作是否完成原创 2018-02-03 12:50:17 · 21310 阅读 · 4 评论 -
c++11 call_once 使用方法
call_once是c++11中引入的新特性,用于保证某个函数只调用一次,即使是多线程环境下,它也可以可靠地完成一次函数调用。特别适用于某个初始化只执行一次的场景。若调用call_once一切顺利,将会翻转once_flag变量的内部状态,再次调用该函数时,所对应的目标函数不会被执行。若调用call_once中发生异常,不会翻转once_flag变量的内部状态,再次调用该函数时,目标函数仍...原创 2018-02-11 18:53:05 · 6306 阅读 · 0 评论 -
自旋锁和互斥锁的区别
POSIX threads(简称Pthreads)是在多核平台上进行并行编程的一套API。线程同步是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间的共享临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。Pthreads提供了多种锁机制:Mutex(互斥量):pthread_mutex...转载 2018-02-23 15:17:56 · 1122 阅读 · 0 评论 -
认识多线程
线程创建函数介绍创建线程可以使用系统提供的API函数:CreateThread来完成,该函数将创建一个线程,其函数声明如下:HANDLE WINAPI CreateThread( __in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in L原创 2017-01-08 22:29:50 · 641 阅读 · 0 评论