简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!
优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列【原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课【原创干货持续更新中……】🚀
人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.
🍉🍉🍉文章目录🍉🍉🍉
- 🌻1.前言
- 🌻2.Linux内核之atomic_long_inc介绍
- 🌻3.代码实例
- 🐓3.1 并发计数
- 🐓3.2 状态统计
- 🐓3.3 简单的同步机制
🌻1.前言
本篇目的:Linux内核之原子操作:atomic_long_inc用法实例
🌻2.Linux内核之atomic_long_inc介绍
-
atomic_long_inc() 函数是 Linux 内核中用于对长整型(long)原子操作的函数之一。它的主要作用是以原子方式增加一个长整型变量的值,并且保证这个操作是不可中断的,即在多线程环境下也能保证数据的一致性和正确性。
-
在 Linux 内核中,原子操作是一种特殊的操作,能够保证在多处理器或者多核系统上的并发执行过程中,对共享数据的访问是安- 全的,不会发生竞态条件(Race Condition)或者数据不一致的情况。atomic_long_inc() 函数就是通过这种机制来实现对长整型变量的安全增加。
-
具体来说,atomic_long_inc() 函数接受一个指向 atomic_long_t 类型的变量的指针作为参数,然后将该变量的值增加 1,并且保证这个增加操作是原子的。在执行增加操作期间,如果其他线程尝试对同一个变量进行操作,它们会被阻塞,直到当前操作完成,从而确保了操作的完整性和一致性。
-
这个函数在 Linux 内核中的应用非常广泛,特别是在实现并发数据结构、同步机制和各种驱动程序中。通过使用原子操作,开发人员可以编写出更加高效、稳定和可靠的多线程代码,而无需担心因为竞态条件而引发的各种问题。
-
总的来说,atomic_long_inc() 函数是 Linux 内核中重要的原子操作函数之一,它的作用是实现对长整型变量的原子增加操作,确保多线程环境下的数据访问安全和一致性。
🌻3.代码实例
🐓3.1 并发计数
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/atomic.h>static atomic_long_t total_count = ATOMIC_LONG_INIT(0);static int __init concurrent_counter_init(void) {atomic_long_inc(&total_count);printk(KERN_INFO "Incremented total count: %ld\n", atomic_long_read(&total_count));return 0;
}static void __exit concurrent_counter_exit(void) {printk(KERN_INFO "Exiting...\n");
}module_init(concurrent_counter_init);
module_exit(concurrent_counter_exit);MODULE_LICENSE("GPL");
- 在并发环境中对计数器进行增加操作。
- 每次模块初始化时,使用 atomic_long_inc() 函数对 total_count 变量进行增加,然后打印增加后的值。
- 由于使用了原子操作,可以确保多个线程同时执行该操作时,不会导致数据竞争。
🐓3.2 状态统计
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/atomic.h>enum driver_state {DRIVER_STATE_IDLE,DRIVER_STATE_BUSY,DRIVER_STATE_ERROR
};static atomic_long_t state_counts[3] = {ATOMIC_LONG_INIT(0),ATOMIC_LONG_INIT(0),ATOMIC_LONG_INIT(0)
};static int __init status_stat_init(void) {enum driver_state current_state = DRIVER_STATE_BUSY;atomic_long_inc(&state_counts[current_state]);printk(KERN_INFO "Incremented count for state %d: %ld\n", current_state, atomic_long_read(&state_counts[current_state]));return 0;
}static void __exit status_stat_exit(void) {printk(KERN_INFO "Exiting...\n");
}module_init(status_stat_init);
module_exit(status_stat_exit);MODULE_LICENSE("GPL");
- 使用 atomic_long_inc() 函数对驱动程序的状态进行统计。
- 假设驱动程序有三种状态:空闲(IDLE)、忙碌(BUSY)和错误(ERROR)。
- 在初始化时,根据当前状态使用 atomic_long_inc() 对相应状态的计数器增加,并打印增加后的值。
🐓3.3 简单的同步机制
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/atomic.h>
#include <linux/delay.h>
#include <linux/kthread.h>static atomic_long_t shared_variable = ATOMIC_LONG_INIT(0);static int my_thread_func(void *data) {int i;for (i = 0; i < 5; ++i) {msleep(1000);atomic_long_inc(&shared_variable);printk(KERN_INFO "Thread: Incremented shared variable to %ld\n", atomic_long_read(&shared_variable));}return 0;
}static int __init atomic_sync_init(void) {struct task_struct *my_thread;my_thread = kthread_run(my_thread_func, NULL, "my_thread");if (IS_ERR(my_thread)) {printk(KERN_ERR "Failed to create thread\n");return PTR_ERR(my_thread);}return 0;
}static void __exit atomic_sync_exit(void) {printk(KERN_INFO "Exiting...\n");
}module_init(atomic_sync_init);
module_exit(atomic_sync_exit);MODULE_LICENSE("GPL");
- 使用原子操作来实现简单的线程同步机制。
- 在初始化时,创建一个简单的内核线程 my_thread,它的工作是每秒对共享变量进行增加操作。
- 由于 atomic_long_inc() 函数是原子的,因此不需要额外的同步手段,就可以确保在多线程环境下对共享变量的操作是安全的。