多线程
文章平均质量分 75
一缕阳光a
(1)、从2018年8月开始从事分布式数据库内核开发工作,包括自研分布式分析型数据库OLAP、自研分布式数据库HTAP,根据开源数据库实现本公司集群型的OLTP产品,以及现在正在做的根据opengaussDB开发的HTAP类型数据库。
(2)、乐于专研,对分布式数据库有强烈的兴趣。
个人邮箱: zgaoq@163.com。
展开
-
多线程的互斥锁应用RAII机制
从输出结果上看,我们的锁是生效的,没有出现错乱。这里的资源可以是文件句柄,内存,Event,互斥量等等,由于系统的资源是有限的,就好比自然界的石油,铁矿一样,不是取之不尽,用之不竭的。在步骤一和步骤二上,我们平时都比较容易把握,而资源的释放会因为种种编码原因容易被忽略,导致系统资源实际没有使用了,但却没有释放或者引发其他问题,影响了系统资源利用率。RAII的做法是使用一个类对象,在对象的构造函数中获取资源,在对象生命期内控制对资源的访问,最后在对象消失时,其析构函数来释放获取的资源;......转载 2022-07-27 17:30:40 · 198 阅读 · 0 评论 -
notify_one() 或 notify_all() 在c++中的使用要点
notify_one() 或 notify_all() 如果在锁(mutex spin_lock)里调用,可能会导致被立刻唤醒的线程继续阻塞,因为锁被notify线程持有。c++标准上说,一些实现(尤其是许多 pthread 的实现)为了归避这种情况,在通知调用中,直接将等待线程从条件变量队列转移到互斥队列,而不唤醒它,来避免此"hurry up and wait"--急于求成 的场景官方文档: https://en.cppreference.com/w/cpp/thread/conditi...原创 2020-11-12 15:11:29 · 2177 阅读 · 0 评论 -
c++ 线程间通信方式
一:两个进程间的两个线程通信,相当于进程间通信二:一个进程中的两个线程间通信 通信方式:1.互斥锁 mutex; lock_guard (在构造函数里加锁,在析构函数里解锁) unique_lock自动加锁、解锁2.读写锁 shared_lock3.信号量 c++11中未实现,可以自己使用mutex和conditon_variabl...转载 2020-01-09 20:37:49 · 1481 阅读 · 0 评论 -
Android HandlerThread 总结使用
Android HandlerThread 总结使用转载请标明出处:http://www.cnblogs.com/zhaoyanjun/p/6062880.html本文出自【赵彦军的博客】前言以前我在 【Android Handler、Loop 的简单使用】 介绍了子线程和子线程之间的通信。很明显的一点就是,我们要在子线程中调用Looper.prepare() 为一个线程开启一个消息循环,默认情况...转载 2018-05-12 22:22:33 · 698 阅读 · 0 评论 -
解决循环引用--弱引用weak_ptr
循环引用: 引用计数是一种便利的内存管理机制,但它有一个很大的缺点,那就是不能管理循环引用的对象。一个简单的例子如下:class parent;class children;typedef shared_ptr<parent> parent_ptr;typedef shared_ptr<children> children_ptr;class parent{...原创 2018-05-03 17:54:30 · 1104 阅读 · 1 评论 -
Python之OS模块进程管理介绍--os.fork()
转自:http://davidbj.blog.51cto.com/4159484/1240586有两种方式来实现并发性,一种方式是让每个“任务"或“进程”在单独的内在空间中工作,每个都有自已的工作内存区域。不过,虽然进程可在单独的内存空间中执行,但除非这些进程在单独的处理器上执行,否则,实际并不是“同时”运行的。是由操作系统把处理器的时间片分配给一个进程,用完时间片后就需退出处理器等待转载 2017-07-11 18:35:37 · 361 阅读 · 0 评论 -
多线程死锁及解决办法
死锁是由于不同线程按照不同顺序进行加锁而造成的。如:线程A:对lock a加锁 => 对lock b加锁 => dosth => 释放lock b => 释放lock a线程B:对lock b加锁 => 对lock a加锁 => dosth => 释放lock a => 释放lock b这样两条线程,就可能发生死锁问题。要避免发生死锁,应该使用同一个顺序进行加锁。转载 2017-05-18 17:22:12 · 4350 阅读 · 0 评论 -
epoll模型之服务器设计
Linux 2.6内核中提高网络I/O性能的新方法-epoll I/O多路复用技术在比较多的TCP网络服务器中有使用,即比较多的用到select函数。1、为什么select落后 首先,在Linux内核中,select所用到的FD_SET是有限的,即内核中有个参数__FD_SETSIZE定义了每个FD_SET的句柄个数,在我用的2.6.15-25-386内核中,该值是1024,转载 2017-05-14 19:29:04 · 537 阅读 · 0 评论 -
使用Epoll 在 Linux 上开发高性能应用服务器
epoll是Linux提供一种多路复用的技术,类似各个平台都支持的select,只是epoll在内核的实现做了更多地优化,可以支持比select更多的文件描述符,当然也支持 socket这种网络的文件描述符。Linux上的大并发的接入服务器,目前的实现方式肯定都通过epoll实现。epoll和线程有很多开发人员用epoll的时候,会开多个线程来进行数据通信,比如一个线程转载 2017-05-23 20:11:52 · 284 阅读 · 0 评论 -
使用epoll+时间堆实现高性能定时器
在开发Linux网络程序时,通常需要维护多个定时器,如维护客户端心跳时间、检查多个数据包的超时重传等。如果采用Linux的SIGALARM信号实现,则会带来较大的系统开销,且不便于管理。本文在应用层实现了一个基于时间堆的高性能定时器,同时考虑到定时的粒度问题,由于通过alarm系统调用设置的SIGALARM信号只能以秒为单位触发,因此需要采用其它手段实现更细粒度的定时操作,当然,这里不考虑原创 2017-05-23 20:08:55 · 1210 阅读 · 1 评论 -
UNIX TCP回射服务器/客户端之使用epoll模型的服务器
程序简介:这是一个运用epoll系列函数进行IO复用的服务器模型。它是目前UNIX与LINUX平台上效率最高,最受欢迎的IO复用传输模型。其他的不说了,直接粘贴代码吧!服务器端:#include "my_unp.h" int main(void) { int listenfd, connfd, sockfd, epfd; int i, ma原创 2017-05-23 20:05:29 · 481 阅读 · 0 评论 -
<java并发编程实战>阅读总结(b)
5、Executor框架Executor框架是并发集合java.util.concurrent中的一个成员。Executor为灵活且强大的异步任务执行框架提供了基础,还提供了对生命周期的支持,以及统计信息、应用管理机制和性能监视等机制。Executor 最早是为了解决生产者-消费者模式而引入的。提交任务相当是生产者,执行任务相当是消费者。线程池:(翻译的文档):线程池和工作原创 2017-01-24 23:11:52 · 313 阅读 · 0 评论 -
多线程(三)
38) 如何在Java中创建Immutable对象?要创建不可变类,要实现下面几个步骤:(1)、通过构造方法初始化所有成员;(2)、对变量不要提供set方法;(3)、将所有的成员声明为私有的,这样就不允许直接访问这些成员;(4)、在get方法中,不要直接返回对象本身,而是克隆对象,并返回对象的拷贝。39) Java中的ReadWriteLock是什么?一般而言,原创 2017-01-20 13:27:54 · 216 阅读 · 0 评论 -
<java并发编程实战>阅读总结(a)
锁(lock)与volatile(1)、隐式锁,java提供了强制原子性的内置锁机制:synchronized块或synchronized方法。操作共享状态的复合操作必须是原子的,以避免竞态条件,比如读-改-写操作和检查再运行操作。复合操作会在完整的运行期占有锁,以确保其行为为原子的。不管是同步代码块还是同步方法,每次只有一个线程可以进入,如果其他线程试图进入(不管是同一同步块还是原创 2017-01-24 17:51:57 · 568 阅读 · 0 评论 -
多线程的异常捕捉
为什么要单独讲多线程的异常捕捉呢?先看个例子:public class ThreadException implements Runnable{ @Override public void run() { throw new RuntimeException(); } //现象:控制台打印出异常信息,并运行一段时间后才停止 pub转载 2017-01-22 18:28:13 · 304 阅读 · 0 评论 -
多线程(一)
1) 什么是线程?线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。程序员可以通过它进行多处理器编程,你可以使用多线程对运算密集型任务提速。比如,如果一个线程完成一个任务要100毫秒,那么用十个线程完成改任务只需10毫秒2) 线程和进程有什么区别?进程是一个独立的具有一定功能的程序,关于某个集合的一次执行过程。线程是进程的原创 2017-01-19 13:28:15 · 248 阅读 · 0 评论 -
多线程(二)
17) 为什么wait()和notify()方法要在同步块中调用?Java API强制要求这样做,否则会抛出IllegalMonitorStateException异常。还有一个原因是为了避免wait和notify之间产生竞态条件。18) 为什么你应该在循环中检查等待条件?防止处于等待状态的线程收到错误的唤醒消息。如果不在循环中检查等待条件,程序就会在没有满足结束条件的情况下退原创 2017-01-20 11:28:23 · 313 阅读 · 0 评论