原子操作,线程间交互数据最细粒度的同步操作,它可以保证线程间读写某个数值的原子性。
由于不需要加重量级的互斥锁进行同步,因此非常轻量,而且也不需要在内核间来回切换调度,效率是非常高的。。
那如何使用原子操作了,各个平台下都有相关api提供了支持,并且向gcc、clang这些编译器,也提供了编译器级的__builtin接口进行支持
windows的Interlockedxxx和Interlockedxxx64系列api
macosx的OSAtomicXXX系列api
gcc的__sync_val_compare_and_swap和__sync_val_compare_and_swap_8等__builtin接口
x86和x86_
继续阅读 »
后端开发中大家肯定遇到过实现一个线程安全的计数器这种需求,根据经验你应该知道我们要在多线程中实现 共享变量 的原子性和可见性问题,于是锁成为一个不可避免的话题,今天我们讨论的是与之对应的无锁 CAS。本文会从怎么来的、是什么、怎么用、原理分析、遇到的问题等不同的角度带你真正搞懂 CAS。
继续阅读 »
Mysql数据库中最常使用的两种表类型为 InnoDB和MyISAM。这两种类型各有优缺点,视具体应用而定。
InnoDB 给 MySQL 提供了具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
InnoDB 提供了行锁(locking on row level),提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs)。这些特性均提高了多用户并发操作的性能表现。
在InnoDB表中不需要扩大锁定(lock esca
继续阅读 »
TBOX的线程池通过在每个worker中批量一次拉取多个task,对锁的竞争进行了优化。
由于每个task的函数实现不会太多,所以可以根据每个task的函数地址做hash,统计出每个task执行所花费的平均时间。然后根据这个平均值来动态计算每个worker一次拉取的task的数量,TBOX里面默认每个worker一次拉取10s的task量,这样可以尽可能的避免worker间锁的频繁抢占。
所有从等待队列被拉取出来的task,都会被放到pending队列中去,如果等待队列中的task都被取完了,某个worker处于了空闲状态,就会尝试去pending中,重新拉取其他worker还没有执行到的task, 这样可以解决某些task耗时
继续阅读 »
Java面试题总结(其一)
1、sleep和wait方法的区别
这两个方法来自不同的类分别是Thread和Object
最主要是sleep方法没有释放锁,而wait方法释放了锁,使得其他线程可以使用同步控制块或者方法。
wait,notify和notifyAll只能在同步控制方法或者同步控制块里面使用,而sleep可以在
任何地方使用
synchronized(x){
x.notify()
//或者wait()
}
sleep必须捕获异常,而wait,notify和notifyAll不需要捕获异常
继续阅读 »
文/Robin
Medium 有篇文章,Entering the DeFi Token Era,讲述了 DeFi 的市值不断扩大,还有 DeFi Token 的创新,详细讲述了 Compound、Balancer、Synthetix 及其 Token 的运作模式。
DeFi 无疑是最近区块链行业的热点,据 DeFi Pulse 数据,目前 DeFi 锁仓的市值为 27.4 亿美元,其中 Compound 占比 23.39%。DeFi 锁仓市值,最近 30 天更是指数级上涨。
那什么是 DeFi 呢?简单讲,Defi 是自己掌握私钥,以数字货币为主体的金融业务。凡是在 Finance 上的业务,都值得用 Decentra
继续阅读 »
Storage Engine
Mongodb 现有两个存储引擎,默认的是MMAPv1,可选的是WiredTiger。可以在启动数据库时指定。wiredTiger支持而MMAPv1不支持的特性有:文档级别锁,数据压缩。
shell
mongod --storageEngine wiredTiger
继续阅读 »
文/Robin
本站推广
币安是全球领先的数字货币交易平台,提供比特币、以太坊、BNB 以及 USDT 交易。
币安注册: https://accounts.binancezh.pro/cn/register/?ref=11190872
邀请码: 11190872
Oracle性能调整在工作中经常遇到,比如TopSQL的出现导致系统资源浪费严重、物理读过多导致IO出现瓶颈、独占锁导致事务不能提交、索引建立不合理导致查询速度极慢、PGA或者SGA设置不合理导致内存不足、PCTFREE值设置不合理导致的行链接、热点块等等。作为一个DBA应该实时的监控系统,然后找出问题,再分析问题,最后解决。真正有难度的是找出问题所在,对于大多数
继续阅读 »
一个自带锁的简单队列, 用单向链表实现:
template
class FastQueue
{
struct node
{
T element;
node * next;
};
node * last;
node * first;
LOCK m_lock;
public:
FastQueue()
{
last = 0;
first = 0;
}
... // 以下暂省略
继续阅读 »
线程局部存储(Thread Local Storage,TLS)主要用于在多线程中,存储和维护一些线程相关的数据,存储的数据会被关联到当前线程中去,并不需要锁来维护。。
因此也没有多线程间资源竞争问题,那如何去实现TLS存储呢,主要有以下几种方式:
gcc和clang的__thread修饰符
windows下msvc的__declspec(thread)修饰符
pthread库pthread_setspecific和pthread_getspecific接口
windows下的TlsSetValue和TlsGetValue
thread和declspec(thread)的使用
其中thread和declspec(thread)
继续阅读 »