OS版本:openEuler 22.03 LTS
架构:x86_64
描述:启动两个内核线程,这两个内核线程都加锁互斥锁对同一个静态全局变量镜像访问。
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sizes.h>
#include <linux/delay.h>
#include <linux/kthread.h>
#include <linux/mutex.h>
static struct task_struct *task1 = NULL;
static struct task_struct *task2 = NULL;
static struct mutex lock;
static int s_count = 0;
static char *thread1 = "mutex-test-thread-1";
static char *thread2 = "mutex-test-thread-2";
int threadfn(void * data)
{
while(!kthread_should_stop()) {
msleep(200);
mutex_lock(&lock);
printk(KERN_INFO "%s is running! s_count = %d\n", (char *)data, s_count);
s_count++;
mutex_unlock(&lock);
}
return 0;
}
static int __init mutex_test_init(void)
{
mutex_init(&lock);
task1 = kthread_create(threadfn, thread1, thread1);
if (!IS_ERR(task1)) {
printk(KERN_INFO "create thread1 success\n");
wake_up_process(task1);
}
task2 = kthread_create(threadfn, thread2, thread2);
if (!IS_ERR(task2)) {
printk(KERN_INFO "create thread2 success\n");
wake_up_process(task2);
}
return 0;
}
static void __exit mutex_test_exit(void)
{
kthread_stop(task1);
kthread_stop(task2);
mutex_destroy(&lock);
printk(KERN_INFO "mutex_test is stop!\n");
return;
}
module_init(mutex_test_init);
module_exit(mutex_test_exit);
MODULE_LICENSE("GPL");
Makefile
obj-m+=mutex_test.o
CONFIG_MODULE_SIG=n
all:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build/ M=$(PWD) clean
测试结果:两个内核线程交替打印静态全局变量