多线程条件下的计数器
来源:互联网 发布:linux为锁添加计数值 编辑:程序博客网 时间:2024/05/17 02:21
最近编码需要实现多线程环境下的计数器操作,统计相关事件的次数。下面是一些学习心得和体会。不敢妄称原创,基本是学习笔记。遇到相关的引用,我会致谢。
当然我们知道,count++这种操作不是原子的。一个自加操作,本质是分成三步的:
1 从缓存取到寄存器
2 在寄存器加1
3 存入缓存。
由于时序的因素,多个线程操作同一个全局变量,会出现问题。这也是并发编程的难点。在目前多核条件下,这种困境会越来越彰显出来。
最简单的处理办法就是加锁保护,这也是我最初的解决方案。看下面的代码:
pthread_mutex_t count_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&count_lock);
global_int++;
pthread_mutex_unlock(&count_lock);
后来在网上查找资料,找到了__sync_fetch_and_add系列的命令,发现这个系列命令讲的最好的一篇文章,英文好的同学可以直接去看原文。Multithreaded simple data type access and atomic variables
__sync_fetch_and_add系列一共有十二个函数,有加/减/与/或/异或/等函数的原子性操作函数,__sync_fetch_and_add,顾名思义,现fetch,然后自加,返回的是自加以前的值。以count = 4为例,调用__sync_fetch_and_add(&count,1),之后,返回值是4,然后,count变成了5.
有__sync_fetch_and_add,自然也就有__sync_add_and_fetch,呵呵这个的意思就很清楚了,先自加,在返回。他们哥俩的关系与i++和++i的关系是一样的。被谭浩强他老人家收过保护费的都会清楚了。
有了这个宝贝函数,我们就有新的解决办法了。对于多线程对全局变量进行自加,我们就再也不用理线程锁了。下面这行代码,和上面被pthread_mutex保护的那行代码作用是一样的,而且也是线程安全的。
__sync_fetch_and_add( &global_int, 1 );
下面是这群函数的全家福,大家看名字就知道是这些函数是干啥的了。
type __sync_fetch_and_add (type *ptr, type value);
type __sync_fetch_and_sub (type *ptr, type value);
type __sync_fetch_and_or (type *ptr, type value);
type __sync_fetch_and_and (type *ptr, type value);
type __sync_fetch_and_xor (type *ptr, type value);
type __sync_fetch_and_nand (type *ptr, type value);
type __sync_add_and_fetch (type *ptr, type value);
type __sync_sub_and_fetch (type *ptr, type value);
type __sync_or_and_fetch (type *ptr, type value);
type __sync_and_and_fetch (type *ptr, type value);
type __sync_xor_and_fetch (type *ptr, type value);
type __sync_nand_and_fetch (type *ptr, type value);
- 多线程条件下的计数器
- 多线程条件下的计数器
- 多线程条件下的计数器__原子的加/减 __sync_fetch_and_add
- linux多线程条件下的计数
- 无锁编程[0]__多线程条件下的计数器__原子的加/减/与/或/异或操作__sync_fetch_and_add,__sync_add_and_fetch等
- 多线程环境下的计数器
- Java多线程和多线程计数器的学习
- 多线程计数器
- 多线程计数器
- 解决Java多线程并发的计数器问题
- 复杂条件下的随机数
- 当一个控制器中有两个scrollview,可以在不用多线程的条件下同时执行
- 多线程计数器锁存器---CountDownLatch
- java--多线程实现计数器
- 多线程安全计数器
- CAS实现多线程计数器
- 记录学习的点滴(Java多线程计数器)
- Java实现多线程环境下的计数器功能
- dom4j 使用简介
- 读样章、写评语,即有机会获赠《编程大师访谈录》!
- 原来都支持64位
- 怎么实现首页隐藏的 UINavigationBar 导航条
- php中的数据类型
- 多线程条件下的计数器
- linux2次锁互斥变量死锁的例子
- Android Camera Subsystem 架构(Binder机制)及显示分析(2)
- 对块设备读写时发生了什么?
- 取消共享
- tsm 恢复某特定的时间,文件
- linuxwireless 资料
- const和readonly
- Linux下用户管理和特殊权限