多线程的虚假唤醒理解

虚假唤醒在多线程环境中,在竞争资源的时候,有时候拿到了锁,却发现资源没了,这可能就是使用了条件等待产生的一个惊群效应。pthread_cond_signal将所有的pthread_cond_wait线程都唤醒了,但是只有个别线程竞争到了资源,没有竞争资源的线程就是属于虚假唤醒的线程。对于虚假唤醒的线程需要做特殊判断,在获取到mutex锁后,要去判断资源是不是为空,是空就是虚假唤醒,继续睡眠。是否有可能多个线程同时读到一个数据的情况呢?这就要从pthread_cond_wait函数的实现讲起。
分类: 其他 发布时间: 01-29 23:54 阅读次数: 0

zookeeper从入门到入土

zookeeper概述zookeeper是⼀个开源的、分布式的,为分布式系统提供协调管理服务的开源软件。为什么需要zookeeper?在分布式系统中,有⼤量的微服务协同对外提供服务,这时需要⼀个稳定的安全的协调管理⼯具,负责管理和协调这些微服务。zookeeper安装安装JDK,并配置环境变量下载 Apache ZooKeeper 3.6.2 Source Releasecentos:yum install cppunityum install python-setuptool
分类: 其他 发布时间: 01-29 23:54 阅读次数: 0

服务器----分布式锁原理

锁线程锁 lock(mutex) 资源操作 unlock(mutex)进程锁(nginx 中 accept 锁-共享内存+信号量)分布式锁 在不同机器的进程的锁分布式锁的实现方案数据库 redis, mysqlzookeeper分布式锁有哪些特征互斥性。可重入性,一个进程允许递归获取锁(需要递归释放锁)。锁超时(进程 crash 掉, 需要考虑释放分布式锁)。高效、 高可用(redis, zk)。公平锁和非公平锁,按获取锁顺序执行, 反之就是
分类: 其他 发布时间: 01-29 23:54 阅读次数: 0

相同指针与全局变量编译之坑

相同指针陷阱这是一个将yp指针的值加到xp指针两次的函数。void fun1(int *xp, int *yp){ *xp += *yp; *xp += *yp;}这个代码表面一看可以优化成这样void fun1(int *xp, int *yp){ *xp += 2 * *yp;}但是如果yp于xp指针指向的是同一个地址,那么情况就会变成这样,此时*xp的结果会是原先的4倍。void fun1(int *xp, int *yp){ *xp += *xp; *xp +=
分类: 其他 发布时间: 01-29 23:54 阅读次数: 0

md5从16字节转换为32字节

## md5从16字节转换为32字节16字节到32字节的转换,实际上是通过将每个字节输出成十六进制数据的来的,所以通过一下函数实现。```c#include <stdio.h>void md5_short_to_long(char *md5_long, char *md5_short){ int i = 0; char *p_md5_long = md5_long; for(i = 0; i < MD5_SHORT; i++){ ...
分类: 其他 发布时间: 01-29 23:53 阅读次数: 0

通过fd链接去获取相应的本地地址和远端地址

## 通过fd链接去获取相应的本地地址和远端地址```cint get_ip_and_port_by_fd(int fd, char* local_ip, int* local_port, char* peer_ip, int* peer_port){ if((!local_ip || !local_port) && (!peer_ip || !peer_port)){ printf("ip or port mem is null\n");...
分类: 其他 发布时间: 01-29 23:53 阅读次数: 0

数据离奇消失bug------栈覆盖

* 工作中遇到的bug,当时写了一块内存后,其他内存的数据消失了,百思不得其解,后来想到会不会是栈内存覆盖,一看还真是。于是就有了这篇文章。* 在通过栈申请的内存有一个特点,他是连续的,这就很容易造成一个现象,如果出现栈溢出问题,会覆盖写掉其他变量的东西。比如我下面写的例子。```c#include <stdio.h>#include <stdlib.h>#include <string.h>char bigmem[50] = {0};void mai
分类: 其他 发布时间: 01-29 23:53 阅读次数: 0

redis之字典实现

字典在不进行rehash的时候,使用的是ht[0],进行rehash的时候,ht[0]和ht[1]一起使用。typedef struct dict { //类型特定函数 dictType *type; //私有数据 void *privdata; //哈希表 dictht ht[2]; // rehash索引 //当rehash不在进行时, 值为-1 in trehashidx; /* rehashing not in pro
分类: 其他 发布时间: 01-29 23:52 阅读次数: 0

redis之跳跃表的实现

跳跃表跳跃表(skiplist) 是一种有序数据结构, 它通过在每个节点中维持多个指向其他节点的指针, 从而达到快速访问节点的目的。跳跃表支持平均O(logN) 、 最坏O(N) 复杂度的节点查找, 还可以通过顺序性操作来批量处理节点。在大部分情况下, 跳跃表的效率可以和平衡树相媲美, 并且因为跳跃表的实现比平衡树要来得更为简单, 所以有不少程序都使用跳跃表来代替平衡树。Redis使用跳跃表作为有序集合键的底层实现之一, 如果一个有序集合包含的元素数量比较多(默认情况是大于128个使用跳表), 又
分类: 其他 发布时间: 01-29 23:52 阅读次数: 0

redis之主从复制实现原理

主从复制redis为了实现⾼可⽤(⽐如解决单点故障的问题),会把数据复制多个副本部署到其他节点上,通过复制,实现Redis的⾼可⽤性,实现对数据的冗余备份,保证数据和服务的可靠性。在Redis中, 用户可以通过执行SLAVEOF命令或者设置slaveof选项, 让一个服务器去复制(replicate) 另一个服务器, 我们称呼被复制的服务器为主服务器(master) , 而对主服务器进行复制的服务器则被称为从服务器(slave)。通过使用slaveof [ip] [port] 即可设置从服务器。
分类: 其他 发布时间: 01-29 23:52 阅读次数: 0

redis之哨兵Sentinel

Sentinel(哨兵)Sentinel(哨岗、 哨兵) 是Redis的高可用性(high availability) 解决方案: 由一个或多个Sentinel实例(instance) 组成的Sentinel系统(system)可以监视任意多个主服务器, 以及这些主服务器属下的所有从服务器, 并在被监视的主服务器进入下线状态时, 自动将下线主服务器属下的某个从服务器升级为新的主服务器, 然后由新的主服务器代替已下线的主服务器继续处理命令请求。如果监视到主服务器下线,那么会先选举出一个Sentinel首
分类: 其他 发布时间: 01-29 23:52 阅读次数: 0

redis高可用之RDB持久化

RDB因为Redis是内存数据库, 它将自己的数据库状态储存在内存里面, 所以如果不想办法将储存在内存中的数据库状态保存到磁盘里面, 那么一旦服务器进程退出, 服务器中的数据库状态也会消失不见。为了解决这个问题, Redis提供了RDB持久化功能, 这个功能可以将Redis在内存中的数据库状态保存到磁盘里面, 避免数据意外丢失。RDB持久化既可以手动执行, 也可以根据服务器配置选项定期执行, 该功能可以将某个时间点上的数据库状态保存到一个RDB文件中。RDB持久化功能所生成的RDB文件是一个经过压
分类: 其他 发布时间: 01-29 23:51 阅读次数: 0

使用跳表实现定时器

使用跳表实现定时器使用的是redis中使用的跳表结构,直接从中迁移出来并修改。通过跳表实现的时间轮,查询第一个数据的时间复杂度就是O(1),插入时间复杂度就 大概率的趋向于O(logn(N))。定时器本身就是从头部开始取数据,跳表这一数据结构就特别匹配定时器的实现。文件skiplist.h#ifndef _MARK_SKIPLIST_#define _MARK_SKIPLIST_/* ZSETs use a specialized version of Skiplists */#def
分类: 其他 发布时间: 01-29 23:51 阅读次数: 0

使用红黑树实现定时器

使用红黑树实现定时器使用的是nginx中使用的红黑树结构,直接从中迁移出来并修改。通过红黑树实现的时间轮,查询与插入的时间复杂度是O(Logn)。查询第一个节点只需要找树的最左边一个节点即可。定时器本身就是从头部开始取数据,红黑树就不比跳表这一数据结构匹配定时器实现的更好。文件rbtree.h#ifndef _NGX_RBTREE_H_INCLUDED_#define _NGX_RBTREE_H_INCLUDED_typedef unsigned int ngx_rbtree_ke
分类: 其他 发布时间: 01-29 23:51 阅读次数: 0

8大常用排序写法

八大排序的理解个人对八大排序的理解,如有错误请指出新人第一次写博客,排版可能稍微不好看,请谅解 代码最简单,但效率低冒泡:相邻比较思想选择:选择最小的思想 代码简单,排序快速,常用插入:与前面比较,大于自己,前移希尔:在插入的基础上做出跨度 使用递归思想,排序快速,代码复杂快速:在逻辑切分数组后将第一个元素作为参考值进行左右在切分,递归思想归并...
分类: 其他 发布时间: 01-29 23:51 阅读次数: 0

关于本博客和发表的文章以及版权声明

这里将发布的文章有这几类,分别是“C/C++ , python, html, linux, mysql”;包括但不限于这几种类别,可能衍生出的各文章,标明原创的版权均归本人所有,任何人或团体、机构全部转载或者部分转载、摘录,请保留本博客链接或标注来源。 这里将不定期发布一些文章,仅在闲暇时刻挑选发布一些技术上分享,如对文章有任何意见或者建议,欢迎评论。...
分类: 其他 发布时间: 01-29 23:50 阅读次数: 0

全栈项目-乐优商场-通用工具服务-通用异常处理

全栈项目-乐优商场-通用工具服务-通用异常处理目录文章目录1、 场景预设1.1、场景1.2、代码1.3、启动测试‘ly-item-service'模块2、错误处理改进2.1、发生错误,我们直接返回异常2.2、\@ControllerAdvice改进2.3、自定义异常类***后记*** :内容项目中出现异常在所难免,那么出现异常后怎么处理呢?1、 场景预设1.1、场景假如我们做新增商品,需要接收下面的参数:price: 价格name: 名称对数据做简单校验:价格不能为空新
分类: 其他 发布时间: 01-29 23:50 阅读次数: 0

element-ui_圣杯布局

element-ui_圣杯布局目录文章目录1、圣杯布局2、element-ui布局组件2.1、常用属性3、element-ui实现圣杯布局***后记*** :内容1、圣杯布局圣杯布局(Holy Graid Layout)指的是一种最常见的网站布局。页面从下而下,分成三个部分:头部(header),躯干(body),尾部(footer)。其中躯干又分成三栏,从左到右为:导航、主栏、副栏。效果图1-1:2、element-ui布局组件这里我们直接使用element-ui提供的布局容器实
分类: 其他 发布时间: 01-29 23:50 阅读次数: 0

element-ui_NavMenu-典型导航菜单

element-ui_NavMenu-典型导航菜单目录文章目录1、效果展示2、element-ui 导航菜单组件2.1、el-menu 菜单2.2、el-submenu 子菜单2.3、el-menu-item 菜单项3、实现***后记*** :内容1、效果展示通过点击三根白色竖线对应的区域,实现导航菜单的展开和折叠展开示例效果0-1:折叠示例效果0-2:2、element-ui 导航菜单组件通用插槽 <template slot="title">
分类: 其他 发布时间: 01-29 23:50 阅读次数: 0

element-ui_dropdown-下拉菜单

element-ui_dropdown-下拉菜单目录文章目录1、效果展示2、下拉菜单相关组件2.1、el-dropdown 下拉菜单2.2、el-dropdown-menu 下拉列表3.3、el-dropdown-item 下拉菜单项3、头像组件_el-avatar4、实现***后记*** :内容1、效果展示应用场景:登录后用户展示折叠效果图示0-1:鼠标悬停效果图示0-2:2、下拉菜单相关组件2.1、el-dropdown 下拉菜单常用属性:属性
分类: 其他 发布时间: 01-29 23:49 阅读次数: 0