文章目录创建线程std::thread 类使用join()使用 detach()警惕作用域线程不能复制给线程传参传递指针传递引用以类成员函数为线程函数以容器存放线程对象互斥量std::mutexstd::lock_guard条件变量call_once 创建线程 C++11 增加了线程以及线程相关的类, 而之前并没有对并发编程提供语言级别的支持 std::thread 类 使用 std::thread 类来创建线程, 我们需要提供的只是线程函数, 或者线程对象, 同时提供必要的参数 std::thread 表示单个执行的线程, 使用thread 类首先会构造一个线程对象, 然后开始执行线程函数, #include <iostream> #include <thread> //需要包含的头 using namespace std; void func(int a, double b) //有参数, 参数数量不限 { cout << a << ' 继续阅读 >>


吕子健 18/09/30 16:27:30
1. 为新线程传递参数 错误代码示例: for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, &i); } 当当当,要提问啦!!! 以上这段代码会发生什么奇怪的事情吗?当线程去进行处理i的时候,如果cpu调度到主线程运行,就会改变i的值。因为传入的是地址,所以线程中使用的i就会被改变。这就会出现问题。那么我们如何给线程传递参数呐?一般有以下两种方法: 1. 传送值而不传送地址 2. 通过`new,malloc`传递 1. 传送值而不传送地址 for (i = 0; i < N; i++) { pthread_create(&tid, NULL, &handle, (void *)i); } void *handle(void *arg) { int i = (int)arg; 。。。 retur 继续阅读 >>


刘生玺 18/09/27 23:41:07
注:本篇博客部分内容引用自:Java并发编程:Lock 引言 在Java 5.0之前,协调对共享对象的访问可以使用到的机制只有synchronized和volatile。在Java 5.0之后,增加了一种新的机制:ReentrantLock。ReentrantLock并不是一种替代内置锁的方法,而是在内置锁不再适用的情况下,作为一种可选择的高级功能。 既生synchronized,何生Lock synchronized主要在功能上存在一些局限性。 如果获取锁的线程由于要等待IO或者其他原因(比如调用sleep方法)被阻塞了,但是又没有释放锁,其他线程便只能干巴巴地等待,试想一下,这多么影响程序执行效率。因此就需要有一种机制可以不让等待的线程一直无期限地等待下去(比如只等待一定的时间或者能够响应中断),通过Lock就可以办到。 再举个例子:当有多个线程读写文件时,读操作和写操作会发生冲突现象,写操作和写操作会发生冲突现象,但是读操作和读操作不会发生冲突现象。 如果采用synchronized关键字来实现 继续阅读 >>


董恒毅 18/09/27 15:46:50
最近由于工作需要,要从hbase中读取数据,然后处理过后,展示给用户,在网上搜通过Python的happybase模块可以进行简单快捷的读取,但是在安装happybase,让我非常不开心,具体错误如下: Collecting happybase Using cached https://files.pythonhosted.org/packages/8d/a4/9c1202ad4276d4e845594d534397c07082b90aee68c67f378fac38629e6f/happybase-1.1.0.tar.gz Requirement already satisfied: six in /usr/local/Python37/lib/python3.7/site-packages (from happybase) (1.11.0) Collecting thriftpy>=0.3.8 (from happybase) Using cached https://files.py 继续阅读 >>


周攀 18/09/27 08:27:17
   首先,如果你还不了解什么是带外数据:点这里 心跳机制的产生就是为了检测出对端主机或到对端的通信路径是否过早失效。 注意:在使用心跳机制时,你应该考虑是不是符合你所处的情景,确定在对端应答的时间超过 5~10s 之后终止连接是件好事还是坏事。如果你的产品需要实时的知道对端的“生存状态”,(要么是为了需求,要么是为了节省资源)那么就是需要这种机制的。一般用于 长连接 。    在这里,我们使用TCP的带外数据来完成心跳机制的实现(每秒钟轮询一次,若5秒没有得到响应就认为对端已经“死亡”),实现如下所示 : 客户端每隔1秒钟向服务器发送一个带外字节,服务器收到该类型的字节然后再发送回一个带外字节。因为每一端都需要对端不复存在或者不再可达。需要指出的是:**数据,回送数据和带外字节都通过单个的连接交换的 。**代码实现如下,具体实现细节在代码中有注释指出 Recvline 函数 #include "../myhead.h" static int recv_cnt = 0; static char 继续阅读 >>


刘生玺 18/09/23 15:31:39
ArchLinux 安装及KDE桌面环境安装配置 首先,安装之前,需要一个“启动介质”,我这里习惯使用USB设备作为启动介质,这是由于ArchLinux滚动更新的特性,而且占用空间很小,以其他的方式安装个人认为不太适合。 话不多说,访问ArchLinux官方网站,点击右上角Download,在下方选择适合你的下载方式或镜像进行下载,我常用的地址是网易的镜像源,和清华大学的镜像源。下载完毕后,我一般使用开源工具Rufus将之写入到U盘中。 安装 将启动U盘插入到电脑中,选择从U盘启动,进入到archlinux的LiveCD模式,若使用网线连接,此时应已经自动配置好网络,可使用ping命令测试网络;若使用无线网络,则键入wifi-menu命令选择并登录无线网络。然后,输入以下命令保证系统时间是正确的: timedatectl set-ntp true 然后我们可以通过fdisk -l命令查看分区情况,若要在此时修改分区表,ArchLinux提供了命令parted和fdisk,可以在此时修改分区表。若要格式 继续阅读 >>


娄泽豪 18/09/22 22:22:39
这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客: 全新的界面设计 ,将会带来全新的写作体验; 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示; 增加了 图片拖拽 功能,你可 继续阅读 >>


刘生玺 18/09/18 17:21:48
为什么需要线程池 在生产环境中,我们不能无限制的创建线程,主要原因如下: 线程创建与销毁的代价并不低; 如果可运行的线程数量多于可用处理器的数量,有些线程将会闲置,大量闲置的线程会消耗系统资源(内存)并给垃圾收集器带来压力; 大量线程竞争CPU也会造成不小的性能开销。 Executor框架 Executor框架在Java 5中被引入,其内部使用了线程池机制。它在java.util.cocurrent包下,通过该框架来控制线程的启动、执行和关闭,可以简化并发编程的操作。 Executor框架包括:线程池,Executor,Executors,ExecutorService等(Callable与Future本篇不进行讨论)。 Executor接口 我们先来了解一下其中的Executor接口: public interface Executor { void execute(Runnable command); } Executor接口的定义非常简单,但它却为灵活 继续阅读 >>


董恒毅 18/09/13 21:38:05
   首先给出OSI 参考模型与TCP/IP协议模型图: 1. 概述: 首先,我们需要知道的是数据分为两种,一种是带内数据,一种是带外数据。带内数据就是我们平常传输或者说是口头叫的数据。带外数据就是我们接下来讲的内容。    许多的传输层都具有带外数据(也称为 经加速数据 )的概念,想法就是连接的某段发生了重要的事情,希望迅速的通知给对端。这里的迅速是指这种通知应该在已经排队了的带内数据之前发送。也就是说,带外数据拥有更高的优先级。带外数据不要求再启动一个连接进行传输,而是使用已有的连接进行传输。    其中,UDP没有实现带外数据(是个极端哦~)    TCP中telnet,rlogin,ftp等应用(除了这样的远程非活跃应用之外,几乎很少有使用到带外数据的地方) 2. TCP 带外数据 2.0 铺垫 : 我们亲爱的 TCP 就位于传输层,下面还有互联网层(主要是IP)与网卡等 。相信学过网络编程的都知道,对于报文的处理,在经过每一层时都会有添加头部和解析头部的操作。 继续阅读 >>


刘生玺 18/09/13 17:36:24
1.非阻塞Connect有什么用? 可以让三路握手的处理等同与一般数据的处理,而不是一直让 connect一直尝试重连或者花费一个RTT时间。而且RTT时间从几毫秒到几秒不等,万一有许多连接,不论是尝试重连还是花费一个RTT时间,都将是致命的延时。 可以使用该技术同时建立多个连接。Web浏览器中常用。 既然使用select等待连接的建立,我们就可以质地不嗯一个时间限制,使得我们能够缩短connect的超时。 2.必须去处理的细节: 处理connect立即建立的情况。(比如我们连接的是同一个主机时) 使用selcet与非阻塞connect的一些注意事项: 2.1. 当连接成功建立后,描述符变为可写。 2.2 当遇到错误时,描述符变为即可写又可读。 3. 两个例子: (1)非阻塞connect:时间获取客户程序 int Connect_nonblock(int sockfd, const SA *saptr, socklen_t salen, int nsec) / 继续阅读 >>


刘生玺 18/09/08 23:33:35