如何调用spin_lock函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何调用spin_lock函数相关的知识,希望对你有一定的参考价值。

我写的是一个普通的应用程序,不是什么核态程序也不是什么嵌入式开发的或者是驱动开发的。我想调用spin_lock函数,但是我也不知道怎么调用,不知道该如何引用头文件,网上说引用<linux/spinlock.h>就可以了,但是我那样引用也编译出错。我locate了一下,那个文件好像在/usr/src/kernels/2.6.27.5-117.fc10.i686/include/linux/spinlock.h下面,但是我直接把这个目录引用进去也不行,不知道是我gcc库不行还是怎么回事。不过我的gcc版本是4.3.2的。简单来说就是引用<linux/spinlock.h>头文件,后gcc编译:gcc -o test test.c 编译时还是会出错,文件找不到,并且里面的函数接口和数据结构也找不到。望高手指点。

参考技术A linux/spinlock.h是系统编程(包括驱动程序的编写)中用到的头文件。应用程序只能通过系统调用来使用内核提供的功能。

spin_lock自旋锁

当线程在获取锁的时候,如果锁已经被其它线程占用,那么该线程将循环等待(而不是进入休眠状态),不断地尝试是否能够成功获取锁,直到成功获取到锁才会退出循环。

循环待的过程中,线程会一直处于活跃状态,占用cpu资源。

使用c++ automic原子类实现一个简单的spin_lock:

#include <string>
#include <iostream>
#include <thread>
#include <atomic>

class spin_lock{
private:
    std::atomic<bool> flag = ATOMIC_VAR_INIT(false);
public:
    spin_lock() = default;
    spin_lock(const spin_lock&) = delete;
    spin_lock& operator = (const spin_lock&) = delete;

    void lock() {
        bool expected = false;
        while (!flag.compare_exchange_strong(expected, true)) {
            expected = false;
        }
    }
    void unlock() {
        flag.store(false);
    }
};

int g_test = 0;
spin_lock g_spinlck;

void work(int& thread_no) {
    for (int i = 0;i < 1000;i++) {
        g_spinlck.lock();
        g_test++;
        std::cout << "thread_no : " << thread_no  << " ; g_test : " << g_test << std::endl;
        g_spinlck.unlock();
    }
}

int main()
{
    int thread_no0 = 0;
    int thread_no1 = 1;
    std::thread thd1(work, std::ref(thread_no0));
    std::thread thd2(work, std::ref(thread_no1));

    thd1.join();
    thd2.join();
    return 0;
}

 

以上是关于如何调用spin_lock函数的主要内容,如果未能解决你的问题,请参考以下文章

scheduling while atomic 出现的错误

Linux内核同步 - spin_lock

spin_lock自旋锁

转自旋锁spin_lock和raw_spin_lock

spin_lock自旋锁

04lock_03spin_lock