Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux

Qt学习笔记之可重入与线程安全

Qt学习笔记之可重入与线程安全

简述本篇文章中,术语“可重入性”和“线程安全”被用来标记类与函数,以表明它们如何被应用在多线程应用程序中。一个线程安全的函数可以同时被多个线程调用,甚至调用者会使用共享数据也没有问题,因为对共享数据的访问是串行的。一个可重入函数也可以同时被多个线程调用,但是每个调用者只能使用自己的数据。因此,一个线程安全的函数总是可重入的,但一个可重入的函数并不一定是线程安全的。扩展开来,一个可重入的类,指的是它的成员函数可...
Qt学习笔记之Threads和QObjects

Qt学习笔记之Threads和QObjects

简述QThread继承自QObject,它发射信号(signals)以表明线程执行开始或结束,并提供了一些槽函数(slots)。更有趣的是,QObjects可以在多线程中使用,发射信号以在其它线程中调用槽函数,并且向“存活”于其它线程中的对象发送事件(post events)。这是可能的,因为每一个线程都拥有它自身的事件循环(event loop)。简述QObject可重入性每个线程的事件循环从其它线程访问QObject子类跨线程的...
Glibc内存管理方式

Glibc内存管理方式

程序员接触的内存空间和系统接触的物理内存空间是有所区别的。对于一般进程来讲,他面对的是一个线性虚拟内存空间:地址从0到最大值。每一个进程面对的虚拟内存空间都是一样的,都享有全部的内存地址。虚拟内存空间是线性的,但并不意味着是连续的。部分地址段的虚拟空间可以是缺失的(不是所有地址都可以用来存储数据)。虚拟内存可以按页管理,每一页大小一般为4kb。每一页背后都有一个实际物理内存(可以是主存也可以是辅存)与之对应。在物理内存中我们不叫页,而称之为帧。分页的好处就...
Glibc头文件和宏定义

Glibc头文件和宏定义

头文件没啥好说的,无非就是" "和< >的区别,这估计只要是学过C/C++的人都明白。现在的编译器对头文件的包含顺序没有要求,但老的C实现则不一样。当然,我们现在无需关心头文件顺序了。我们为啥要包含头文件呢?头文件里面有定义嘛,使用任何函数之前都必须定义该函数。所以我们并不强求包含头文件,只要你自己在库函数使用之前定义该函数,有些编译器还会自动的添加标准库定义。但是呐,我们还是推荐将头文件添加上去,头文件里面有时候还会包含类型定义、常量定义、宏...
将本地的Java项目提交到GitHub

将本地的Java项目提交到GitHub

1.我们新建一个了java项目后,需要提交到github进行版本控制2.如果此时github中的仓库不为空,我们在本地使用git push提交时会报以下错误,! [rejected] master -> master (non-fast-forward)原因:github仓库中已经存在本地项目中不存在的文件,发生了冲图解决方法:先将github仓库中的文件全部pull下来,此时由于这是2个不相关的仓库,直接使用git pull 会报错:fata...
Linux C动态内存泄漏追踪方法

Linux C动态内存泄漏追踪方法

C里面没有垃圾回收机制,有时候你申请了动态内存却忘记释放,这就尴尬了(你的程序扮演了强盗角色,有借有还才是好孩子)。当你想找出内存泄露的地方时,有的投入海量的代码中,头痛不已。还好GNU C库提供了些简单的方法。mtrace和muntrace两个函数可以帮助我们追踪动态内存使用情况。前提是我们设置了MALLOC_TRACE环境变量,改环境变量需要指向我们系统下的一个可写入的常规文件。做法如下:MALLOC_TRACE=/your/path/to/file....
Glibc 内存申请和释放及堆连续检查

Glibc 内存申请和释放及堆连续检查

C语言有两种内存申请方式:1、静态申请:当你声明全局或静态变量的时候,会用到静态申请内存。静态申请的内存有固定的空间大小。空间只在程序开始的时候申请一次,并且不再释放(除非程序结束)。2、自动申请:当你声明自动变量的时候会使用自动申请。函数参数、局部变量都属于自动变量。这些变量空间在程序执行致相关语句块申请,离开语句块时释放。还有一种内存申请方式:动态内存申请。C语言变量并不支持动态内存申请,这一功能由库函数实现。C里面没有动态这个存储类型!!当你需要存储...
Java内存模型-基础

Java内存模型-基础

基础并发编程模型的分类在并发编程中,我们需要处理两个关键问题:线程之间如何通信及线程之间如何同步(这里的线程是指并发执行的活动实体)。通信是指线程之间以何种机制来交换信息。在命令式编程中,线程之间的通信机制有两种:共享内存和消息传递。在共享内存的并发模型里,线程之间共享程序的公共状态,线程之间通过写-读内存中的公共状态来隐式进行通信。在消息传递的并发模型里,线程之间没有公共状态,线程之间必须通过明确的发送消息来显式进行通信。同步是指程序用于控制不同线程之间...
Java内存模型-重排序

Java内存模型-重排序

数据依赖性如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性。数据依赖分下列三种类型:名称代码示例说明写后读a = 1;b = a;写一个变量之后,再读这个位置。写后写a = 1;a = 2;写一个变量之后,再写这个变量。读后写a = b;b = 1;读一个变量之后,再写这个变量。上面三种情况,只要重排序两个操作的执行顺序,程序的执行结果将会被改变。前面提到过,编译器和处理器可能会对操作做重排序。编译器和处理器在重...
ConcurrentHashMap原理分析

ConcurrentHashMap原理分析

当我们享受着jdk带来的便利时同样承受它带来的不幸恶果。通过分析Hashtable就知道,synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,而现在的解决方案----ConcurrentHashMap。ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图 左边便是Hashtable的实现方式---锁整个hash表;而右边则是ConcurrentHashMap...
Java中newInstance()和new()

Java中newInstance()和new()

在Java开发特别是数据库开发中,经常会用到Class.forName( )这个方法。通过查询Java Documentation我们会发现使用Class.forName( )静态方法的目的是为了动态加载类。在加载完成后,一般还要调用Class下的newInstance( )静态方法来实例化对象以便操作。因此,单单使用Class.forName( )是动态加载类是没有用的,其最终目的是为了实例化对象。这里有必要提一下就是Class下的newInstance...
Linux C 内存管理方式之半动态

Linux C 内存管理方式之半动态

看到半动态申请内存,第一反应这是什么鬼?实际上半动态内存申请很容易理解,在GNU C中使用alloca函数来实现#include <stdlib.h>void *alloca (size_t size)alloca函数可以像malloc一样动态申请内存(注意所申请的内存位置在调用函数的栈里面,页因此在调用函数结束后自动释放)好处是显而易见的:既可以自由得申请空间,又不需要手动释放内存。坏处是:发生错误时,无法得到一个清晰得错误消息。还有就是,非...
Java的值传递和引用传递

Java的值传递和引用传递

我们先说下值传递和引用传递java官方解释:值传递:(形式参数类型是基本数据类型):方法调用时,实际参数把它的值传递给对应的形式参数,形式参数只是用实际参数的值初始化自己的存储单元内容,是两个不同的存储单元,所以方法执行中形式参数值的改变不影响实际参数的值。引用传递:(形式参数类型是引用数据类型参数):也称为传地址。方法调用时,实际参数是对象(或数组),这时实际参数与形式参数指向同一个地址,在方法执行中,对形式参数的操作实际上就是对实际参数的操作,这个结果...
Java内存模型-顺序一致性

Java内存模型-顺序一致性

数据竞争与顺序一致性保证当程序未正确同步时,就会存在数据竞争。java 内存模型规范对数据竞争的定义如下:在一个线程中写一个变量,在另一个线程读同一个变量,而且写和读没有通过同步来排序。当代码中包含数据竞争时,程序的执行往往产生违反直觉的结果(前一章的示例正是如此)。如果一个多线程程序能正确同步,这个程序将是一个没有数据竞争的程序。JMM 对正确同步的多线程程序的内存一致性做了如下保证:如果程序是正确同步的,程序的执行将具有顺序一致性(sequential...
<< 3801 3802 3803 3804 3805 3806 3807 3808 3809 3810 >>