接上 一篇文章 ,这里介绍另一种线程间通信的方式:completion机制。Completion机制是线程间通信的一种轻量级机制:允许一个线程告诉另一个线程工作已经完成。为使用 completion, 需要包含头文件 <linux/completion.h>。

可以通过以下方式来创建一个 completion :

DECLARE_COMPLETION(my_completion);

或者, 动态创建和初始化:

struct completion my_completion;

init_completion(&my_completion);

等待 completion 是一个简单事来调用: void wait_for_completion(struct completion *c);

注意:这个函数进行一个不可打断的等待. 如果你的代码调用 wait_for_completion 并且

没有人完成这个任务, 结果会是一个不可杀死的进程。

completion 事件可能通过调用下列之一来发出:

void complete(struct completion *c);

void complete_all(struct completion *c);

如果多于一个线程在等待同一个 completion 事件, 这 2 个函数做法不同. complete 只

唤醒一个等待的线程, 而 complete_all 允许它们所有都继续。

下面来看使用completion机制的实现代码:

#include <linux/init.h>   #include <linux/module.h>   #include <linux/kthread.h>   #include <linux/wait.h>#include <linux/completion.h>MODULE_LICENSE("Dual BSD/GPL");  static struct completion  comp;  static struct task_struct * _tsk;  static struct task_struct * _tsk1;static int tc = 0;static int thread_function(void *data)
{  do {  printk(KERN_INFO "IN thread_function thread_function: %d times \n", tc);    wait_for_completion(&comp);//tc = 0;  ///在哪里都行
                   printk(KERN_INFO "has been woke up !\n");}while(!kthread_should_stop());  return tc;  }   static int thread_function_1(void *data)
{  do {  printk(KERN_INFO "IN thread_function_1 thread_function: %d times\n", ++tc);  if(tc == 10){complete(&comp);tc = 0;}msleep_interruptible(1000);}while(!kthread_should_stop());  return tc;  }  static int hello_init(void)
{  printk(KERN_INFO "Hello, world!\n");  init_completion(&comp);_tsk = kthread_run(thread_function, NULL, "mythread"); if (IS_ERR(_tsk)) {  printk(KERN_INFO "first create kthread failed!\n");  }  else {  printk(KERN_INFO "first create ktrhead ok!\n");  }  _tsk1 = kthread_run(thread_function_1,NULL, "mythread2");if (IS_ERR(_tsk1)) {  printk(KERN_INFO "second create kthread failed!\n");  }  else {  printk(KERN_INFO "second create ktrhead ok!\n");  }  return 0;  }  static void hello_exit(void)
{  printk(KERN_INFO "Hello, exit!\n");  if (!IS_ERR(_tsk)){  int ret = kthread_stop(_tsk);  printk(KERN_INFO "First thread function has stopped ,return %d\n", ret);  }  if(!IS_ERR(_tsk1)){int ret = kthread_stop(_tsk1);printk(KERN_INFO "Second thread function_1 has stopped ,return %d\n",ret);}}   module_init(hello_init);  module_exit(hello_exit);  

运行结果:

Linux内核多线程(四)相关推荐

  1. Linux内核多线程实现方法 —— kthread_create函数

          Linux内核多线程实现方法 -- kthread_create函数 内核经常需要在后台执行一些操作,这种任务就可以通过内核线程(kernle thread)完成独立运行在内核空间的标准进 ...

  2. linux内核分为四个子系统,linux操作系统的内核有哪几个子系统构成,简要说明各子系统的作用...

    Linux是一个一体化内核(monolithic kernel)系统."内核"指的是一个提供硬件抽象层.磁盘及文件系统控制.多任务等功能的系统软件.一个内核不是一套完整的操作系统. ...

  3. Linux 内核调试 四:qemu-system-arm功能选项整理

    参考资料: https://qemu.readthedocs.io/en/latest/about/index.html onlylove@ubuntu:~/My/qemu/qemu-lq$ ./qe ...

  4. Linux内核多线程(三)

    接上 一篇文章 ,这里介绍另一种线程间通信的方式:completion机制.Completion机制是线程间通信的一种轻量级机制:允许一个线程告诉另一个线程工作已经完成.为使用 completion, ...

  5. linux 内核互斥体,Linux 内核同步(六):互斥体(mutex)

    互斥体 互斥体是一种睡眠锁,他是一种简单的睡眠锁,其行为和 count 为 1 的信号量类似.(关于信号量参考:Linux 内核同步(四):信号量 semaphore). 互斥体简洁高效,但是相比信号 ...

  6. 异域linux内核漏洞,Linux内核再现漏洞!这次11年后才发现

    原标题:Linux内核再现漏洞!这次11年后才发现 还记得上一次Linux内核出现大的漏洞是什么时候吗?2009年Linux内核出现严重安全漏洞,直到2014年才被发现,这个严重安全漏洞整整存在了5年 ...

  7. linux内核编程_内核线程kthread_run

    linux内核编程_内核线程kthread_run 1. 简述: 2. 使用示例: 3. 详述: 1. 简述: 头文件: include/linux/kthread.h 数据类型: struct ta ...

  8. Linux C++多线程同步的四种方式

    目录 一.互斥锁 二.条件变量 三.读写锁 原文链接:Linux C++多线程同步的四种方式(非常详细)_Y先森0.0-CSDN博客 背景问题:在特定的应用场景下,多线程不进行同步会造成什么问题? 通 ...

  9. Linux内核实验作业四

    实验作业:使用库函数API和C代码中嵌入汇编代码两种方式使用同一个系统调用 20135313吴子怡.北京电子科技学院 [第一部分]使用库函数API来获取用户标识号.库函数为getuid() 代码如下: ...

  10. Linux内核同步机制之(四):spin lock【转】

    转自:http://www.wowotech.net/kernel_synchronization/spinlock.html 一.前言 在linux kernel的实现中,经常会遇到这样的场景:共享 ...

最新文章

  1. envi读取格式ang 还是mtl,Landsat FAST文件格式及在ENVI中的读取方法
  2. 解密春晚微信红包十亿级并发压力
  3. 在虚机上安装WIN2003
  4. 前端学习(3116):react-hello-react的事件绑定
  5. 特斯拉入驻天猫卖车了 将连做8天直播
  6. 滴滴顺风车再调整服务时间:男女用户一视同仁
  7. eplan加密狗已损坏_EPLAN Electric P8 仿真加密狗 error 1068 问题
  8. 黑莓发布自动驾驶安全管家软件Jarvis
  9. 随机森林的原理及Python代码实现
  10. Yii 2.0.3 Advanced版控制器不能包含大写字母的Bug
  11. 如何用计算机测量图片景深,景深(摄影测量与遥感学术语 .)_百度百科
  12. 【数据分析】京东订单数据分析思路及Python代码
  13. python 调用淘宝客api
  14. IPD解读--华为500强的研发第一名,除了钱还有IPD
  15. 表格的属性、表格的合并及表单
  16. TeamViewer使用心得
  17. 电脑显示请检查映像服务器,该任务映像已损坏或已篡改的解决方法
  18. Database System Concepts(Fourth Edition)
  19. python后台操作炒股软件下载_GitHub - lipq525/stock-1: stock,股票系统。使用python进行开发。...
  20. Hi3521DV100 USB无法识别问题分析

热门文章

  1. 一步一步学习hadoop(九)
  2. Ext中extend
  3. 路由交换技术——IS-IS
  4. 基于Vue.js 2.x系列 + Element UI + RBAC/AUTH权限 的响应式后台管理系统
  5. 渗透场景篇--当XSS遇上CSRF
  6. python字符类型
  7. Notification(一)系统通知的监听移除
  8. linux 网络编程
  9. ADSL桥接模式和路由模式的区别(转)
  10. mysql 的各种 join