dpdk 自旋锁

摘要:
#ifndef_SPIN_LOCK___#define_SPIN_LOCK__typedefstruct{volatieintlocked;/**˂lockstatus0=解锁,1=锁定*/}rte_spinlock_t;void rte_ Pause(){;}//自旋锁初始化,lock=0,标识无锁定状态staticinlinevoid rte_ Spinlock_ in
#ifndef __SPIN_LOCK__
#define __SPIN_LOCK__

typedef struct {
    volatile int locked; /**< lock status 0 = unlocked, 1 = locked */
} rte_spinlock_t;

void rte_pause(){
        ;
}

//spinlock的初始化,lock=0,标识无锁状态
static inline void
rte_spinlock_init(rte_spinlock_t *sl)
{
    sl->locked = 0;
}

//加锁,也就是locked置1
static inline void
rte_spinlock_lock(rte_spinlock_t *sl)
{
    while (__sync_lock_test_and_set(&sl->locked, 1))
        while(sl->locked)
            rte_pause();
}

//解锁
static inline void
rte_spinlock_unlock (rte_spinlock_t *sl)
{
    __sync_lock_release(&sl->locked);
}

// 尝试加锁,如果当前状态是无锁,func返回1,标识加锁成功,失败func返回0
static inline int
rte_spinlock_trylock (rte_spinlock_t *sl)
{
    return (__sync_lock_test_and_set(&sl->locked,1) == 0);
}

//返回当前锁的status
static inline int rte_spinlock_is_locked (rte_spinlock_t *sl)
{
    return sl->locked;
}

#endif
#include "spinlock.h"
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>

static int num =0; 
rte_spinlock_t retlock;

void *testfunc(void *arg)
{
    int i=0,t;
    for(i=0;i<20000;i++)
    {   
        rte_spinlock_lock(&retlock);
        num++;
        rte_spinlock_unlock(&retlock);
    }
}

int main()
{
        rte_spinlock_init(&retlock);

    pthread_t thread[20];
    int i;
    for(i=0;i<20;i++)
    {
        pthread_create(&thread[i],NULL,testfunc,NULL);
    }
    for(i=0;i<20;i++)
    {
        pthread_join(thread[i],NULL);
    }
    printf("%d
",num);
 }
root@ubuntu:~/dpdk-function# g++ -pthread  -o spinlock   spinlock_test.c
root@ubuntu:~/dpdk-function# ./spinlock 
400000
root@ubuntu:~/dpdk-function# 

定义静态函数:在函数返回类型前加上static关键字,函数即被定义为静态函数,其特点如下:

a.静态函数只能在本源文件中使用

b.在文件作用域中声明的inline函数默认为static类型

/* file1.c */
#include <stdio.h>

static void fun(void)
{
    printf("hello from fun.
");
}

int main(void)
{
    fun();
    fun1();

    return 0;
}

/* file2.c */
#include <stdio.h>

static void fun1(void)
{
    printf("hello from static fun1.
");
}
/tmp/cc2VMzGR.o:在函数‘main’中:
static_fun.c:(.text+0x20):对‘fun1’未定义的引用
collect2: error: ld returned 1 exit status

总结:用static定义的全局和局部静态变量的区别是,全局的静态变量的作用域和可见域都是从文件的定义开始到整个文件结束;而局部的静态变量可见域是从文件的定义开始到整个文件结束,作用域是从该语句块的定义开始到该语句块结束。

免责声明:文章转载自《dpdk 自旋锁》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Oracle SQL*Loader 使用指南c#删除Tool Strip Container控件下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

(转)乐观的并发策略——基于CAS的自旋

  悲观者与乐观者的做事方式完全不一样,悲观者的人生观是一件事情我必须要百分之百完全控制才会去做,否则就认为这件事情一定会出问题;而乐观者的人生观则相反,凡事不管最终结果如何,他都会先尝试去做,大不了最后不成功。这就是悲观锁与乐观锁的区别,悲观锁会把整个对象加锁占为自有后才去做操作,乐观锁不获取锁直接做操作,然后通过一定检测手段决定是否更新数据。这一节将对...

华为内部面试题库(10)

1. 对于linux内核信号量,说法正确的是(多选):(参考:Linux内核设计与实现,第二版,第9章,9.4小节) A. 如果获取一个被占用的信号量,任务会睡眠,等待信号量释放之后,该任务才能重新获得调度 B. 信号量可以允许任意数量的锁持有者 C. 信号量保护的代码可以被抢占 D. 信号量的实现也是与体系架构相关的 答案:A,B,C,D 试题解析:信号...

Code Tips: 线程读写锁自旋导致的死循环

发现问题        项目测试的时候,发现运行一段时间后会出现cpu百分之百的情况。     想着可能是哪里出现了死循环,于是打算用gdb跟一下,结果gdb居然无法attach到进程。 定位问题     查了查去,原来有一个优先级为RT的实时线程出现了死循环,并且由于配置了CPU的亲和属性,使得进程只运行在第一个核上,此时gdb就无法attach了   ...

synchronized实现原理及锁优化

1.引言 并发编程中synchronized是重量级锁,但随着JVM1.6对synchronized进行优化后,有些情况下它并不那么重,本文介绍了Java SE1.6中为了减少获得锁和释放锁带来的性能消耗而引入的偏向锁和轻量级锁,以及锁的存储结构和升级过程。 2.术语定义 CAS(Compare and Swap):比较并交换。用于在硬件层面上提供原子性操...

C++线程中的几种锁

线程之间的锁有:互斥锁、条件锁、自旋锁、读写锁、递归锁。一般而言,锁的功能越强大,性能就会越低。 1、互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量。也就是说是为了避免多个线程在某一时刻同时操作一个共享资源。例如线程池中的有多个空闲线程和一个任务队列。任何是一个线程都要使用互斥锁互斥访问任务队列,以避免多个线程同时访问任务队列以发生错...

jvm锁的四种状态 无锁状态 偏向锁状态 轻量级锁状态 重量级锁状态

一:java多线程互斥,和java多线程引入偏向锁和轻量级锁的原因? --->synchronized是在jvm层面实现同步的一种机制。    jvm规范中可以看到synchronized在jvm里实现原理,jvm基于进入和退出Monitor对象来实现方法同步和代码块同的。在代码同步的开始位置织入monitorenter,在结束同步的位置(正常结束和...