当前位置:  技术问答>linux和unix

原子操作 怎么弄?

    来源: 互联网  发布时间:2017-01-03

    本文导语:  就是每次可以自加1或者减一的原子操作。。。 linux下是怎么做的? 我查了下 atomic_sub 好像可以,但是找不到定义 不知道是哪儿来的。。。。 |  #include  sem_init sem_destroy(3), sem_post(3), sem_w...

就是每次可以自加1或者减一的原子操作。。。

linux下是怎么做的?

我查了下 atomic_sub 好像可以,但是找不到定义 不知道是哪儿来的。。。。

|
 #include 
sem_init
sem_destroy(3), sem_post(3), sem_wait(3)

sem_open
sem_close(3), sem_getvalue(3), sem_post(3), sem_unlink(3), sem_wait(3)

|
3代表的是man中的3


|
信号灯
System V版本的,或posix版本的都可以

|
原子操作就是让一次操作不被打断吧
这可能有好多方式可以实现
信号灯
互斥锁
信号量
都可以

|
你可以使用嵌入汇编代码的方式,或者写入编译指示,来形成简单的原子操作,例如自加、自减。

|
原子操作和同步还是不一样的,真正的原子操作还是得操作系统支持的,同步自己做互斥就可以了。

|
用了  汇编里面 .lock 前缀

就是 指定锁定总线吧,

普通的  减 sub

原子的就是 .lock sub 

这样吧,cpu提供的保证

|

  /**
  * atomic_sub - subtract the atomic variable
  * @i: integer value to subtract
  * @v: pointer of type atomic_t
  * 
  * Atomically subtracts @i from @v.
  */
 static __inline__ void atomic_sub(int i, atomic_t *v)
 {
         __asm__ __volatile__(
                  LOCK "subl %1,%0"
                 :"=m" (v->counter)
                  :"ir" (i), "m" (v->counter));
 }





很容易找阿

|
用户态一般没有整数原子操作的说法,这些功能都在在内核使用。

linux-2.6.xx/include/asm-i386/atomic.h:


/*
 * Make sure gcc doesn't try to be clever and move things around
 * on us. We need to use _exactly_ the address the user gave us,
 * not some alias that contains the same information.
 */
typedef struct { volatile int counter; } atomic_t;

#define ATOMIC_INIT(i) { (i) }

/**
 * atomic_read - read atomic variable
 * @v: pointer of type atomic_t
 * 
 * Atomically reads the value of @v.
 */ 
#define atomic_read(v) ((v)->counter)

/**
 * atomic_set - set atomic variable
 * @v: pointer of type atomic_t
 * @i: required value
 * 
 * Atomically sets the value of @v to @i.
 */ 
#define atomic_set(v,i) (((v)->counter) = (i))

/**
 * atomic_add - add integer to atomic variable
 * @i: integer value to add
 * @v: pointer of type atomic_t
 * 
 * Atomically adds @i to @v.
 */
static __inline__ void atomic_add(int i, atomic_t *v)
{
__asm__ __volatile__(
LOCK "addl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}

/**
 * atomic_sub - subtract the atomic variable
 * @i: integer value to subtract
 * @v: pointer of type atomic_t
 * 
 * Atomically subtracts @i from @v.
 */
static __inline__ void atomic_sub(int i, atomic_t *v)
{
__asm__ __volatile__(
LOCK "subl %1,%0"
:"=m" (v->counter)
:"ir" (i), "m" (v->counter));
}

/**
 * atomic_sub_and_test - subtract value from variable and test result
 * @i: integer value to subtract
 * @v: pointer of type atomic_t
 * 
 * Atomically subtracts @i from @v and returns
 * true if the result is zero, or false for all
 * other cases.
 */
static __inline__ int atomic_sub_and_test(int i, atomic_t *v)
{
unsigned char c;

__asm__ __volatile__(
LOCK "subl %2,%0; sete %1"
:"=m" (v->counter), "=qm" (c)
:"ir" (i), "m" (v->counter) : "memory");
return c;
}

/**
 * atomic_inc - increment atomic variable
 * @v: pointer of type atomic_t
 * 
 * Atomically increments @v by 1.
 */ 
static __inline__ void atomic_inc(atomic_t *v)
{
__asm__ __volatile__(
LOCK "incl %0"
:"=m" (v->counter)
:"m" (v->counter));
}

/**
 * atomic_dec - decrement atomic variable
 * @v: pointer of type atomic_t
 * 
 * Atomically decrements @v by 1.
 */ 
static __inline__ void atomic_dec(atomic_t *v)
{
__asm__ __volatile__(
LOCK "decl %0"
:"=m" (v->counter)
:"m" (v->counter));
}

... ...

|

你说的不是原子操作,原子操作不仅不会被本进程的其他部分打断,而且在整个系统的所有程序都不打断才行

    
 
 

您可能感兴趣的文章:

  • Linux下GCC内置原子操作函数(多线程资源访问)介绍
  • 关于原子操作的疑问
  • linux内核原子量操作的小疑问
  • linux中同步与原子操作的相关知识辨析【请教高手】
  • shmget shmctl shmop 是不是都是原子操作
  • unix编程,两条语句,有方法可以保证是原子操作吗
  • 怎么实现一个原子操作
  • linux平台usleep(time);函数是否是原子操作不能被CPU线程切换打断?
  • 请问:如何让对多个现有的文件的写操作成为一个原子操作,并可以实现安全的回滚功能?
  • 不理解为什么这样就是原子的操作了
  • 原子操作的问题
  • 什么是原子操作?
  • 在用户态如何使用原子操作?
  • linux上到应用程序原子操作的实现问题
  • 谁知道solaris对socket的recv和send函数是否是原子操作,谢谢!!
  • linux中有对某个数值进行原子操作的函数吗?
  • 高手请进!Solaris下如何实现原子加的操作?不用互斥量等等同步对象!
  • linux原子操作的疑惑
  • 新手求教LINUX下的原子操作该怎么写
  • asm volatile("incl %0":"+r"(b));是原子操作么。。。
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 原子上下文 不能睡眠的原因是? 原子上下文能否调度?
  • 进程中原语的原子性得不到保证会怎样?
  • 问个IO原子性的问题
  • 问一个有名管道的原子性读写的问题(版主们一定要进)
  • 求助:关于pipe写入的原子性


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3