Linux內核 -- 多線程之完成量completion的使用

Linux Kernel Completion 使用指南

在Linux內核編程中,completion是一個用于進程同步的機制,常用于等待某個事件的完成。它提供了一種簡單的方式,讓一個線程等待另一個線程完成某項任務。

基本使用方法

初始化

completion結構需要在使用之前進行初始化,可以使用以下兩種方式之一:

  1. 靜態初始化:
DECLARE_COMPLETION(my_completion);
  1. 動態初始化:
struct completion my_completion;
init_completion(&my_completion);

等待事件

一個線程可以調用wait_for_completion或其變種來等待事件的完成:

wait_for_completion(&my_completion);

變種方法包括:

  • wait_for_completion_timeout(&my_completion, timeout):帶超時的等待。
  • wait_for_completion_interruptible(&my_completion):可以被中斷的等待。
  • wait_for_completion_killable(&my_completion):可以被kill信號中斷的等待。

觸發事件

當某個事件完成時,應該調用complete函數來喚醒等待的線程:

complete(&my_completion);

如果有多個等待者,并且你希望喚醒所有等待者,可以使用complete_all

complete_all(&my_completion);

高級使用方法

重新初始化

在某些情況下,一個completion結構可能需要重復使用,這時可以使用reinit_completion重新初始化:

reinit_completion(&my_completion);

超時等待

為了避免無限期等待,可以使用帶超時的等待函數,例如:

unsigned long timeout = msecs_to_jiffies(500); // 500 ms
wait_for_completion_timeout(&my_completion, timeout);

可中斷的等待

有時需要等待可以被中斷,可以使用wait_for_completion_interruptiblewait_for_completion_killable

int ret;
ret = wait_for_completion_interruptible(&my_completion);
if (ret == -ERESTARTSYS) {// 等待被信號中斷
}

注意事項

  1. 初始化問題:確保在使用completion之前正確初始化,避免使用未初始化的completion。
  2. 重入問題:避免對同一個completion結構多次調用complete,因為這會導致不可預測的行為。
  3. 超時處理:合理使用超時等待,避免線程無限期掛起。
  4. 中斷安全:在中斷上下文中不能使用可能導致睡眠的函數,例如等待函數。
  5. 資源釋放:在模塊卸載或資源釋放時,確保沒有線程在等待,避免資源泄漏或訪問非法內存。

代碼示例

以下是一個簡單的例子,展示了一個線程等待另一個線程完成某項任務:

#include <linux/module.h>
#include <linux/completion.h>
#include <linux/kthread.h>
#include <linux/delay.h>static struct completion my_completion;int worker_thread(void *data) {printk(KERN_INFO "Worker thread: Starting work\n");msleep(5000);  // 模擬工作printk(KERN_INFO "Worker thread: Work done, signaling completion\n");complete(&my_completion);return 0;
}static int __init my_module_init(void) {struct task_struct *task;init_completion(&my_completion);task = kthread_run(worker_thread, NULL, "worker_thread");if (IS_ERR(task)) {printk(KERN_ERR "Failed to create worker thread\n");return PTR_ERR(task);}printk(KERN_INFO "Main thread: Waiting for completion\n");wait_for_completion(&my_completion);printk(KERN_INFO "Main thread: Detected completion\n");return 0;
}static void __exit my_module_exit(void) {printk(KERN_INFO "Module exit\n");
}module_init(my_module_init);
module_exit(my_module_exit);MODULE_LICENSE("GPL");

這個例子創建了一個工作線程,該線程在完成工作后調用complete。主線程等待工作線程完成后繼續執行。

總結

Linux內核中的completion機制是一個強大的工具,用于線程間的同步。通過合理使用它,可以有效地控制線程的執行順序,確保程序的正確性。在使用時,應注意初始化、超時、中斷安全等問題,以避免潛在的bug。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/38451.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/38451.shtml
英文地址,請注明出處:http://en.pswp.cn/web/38451.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

順序串算法庫構建

學習賀利堅老師順序串算法庫 數據結構之自建算法庫——順序串_創建順序串s1,創建順序串s2-CSDN博客 本人詳細解析博客 串的概念及操作_串的基本操作-CSDN博客 版本更新日志 V1.0: 在賀利堅老師算法庫指導下, 結合本人詳細解析博客思路基礎上,進行測試, 加入異常彈出信息 v1.0補…

已解決java.awt.geom.NoninvertibleTransformException:在Java2D中無法逆轉的轉換的正確解決方法,親測有效!!!

已解決java.awt.geom.NoninvertibleTransformException&#xff1a;在Java2D中無法逆轉的轉換的正確解決方法&#xff0c;親測有效&#xff01;&#xff01;&#xff01; 目錄 問題分析 出現問題的場景 報錯原因 解決思路 解決方法 1. 檢查縮放因子 修改后的縮放變換 …

關鍵路徑——C語言(理論)

關鍵路徑&#xff0c;是項目網絡中從起始事件到終止事件的最長路徑&#xff0c;決定了項目的最短完成時間。 關鍵路徑中的任務沒有任何可調整的余地&#xff0c;如果任何一個任務被延遲&#xff0c;整個項目的完成時間也會被延遲。 假設我們現在有一個圖&#xff1a;把圖的邊…

node編譯打包Error: error:0308010C:digital envelope routines::unsupported

問題描述&#xff1a; 報錯&#xff1a;Error: error:0308010C:digital envelope routines::unsupported 報錯原因&#xff1a; 主要是因為 nodeJs V17 版本發布了 OpenSSL3.0 對算法和秘鑰大小增加了更為嚴格的限制&#xff0c;nodeJs v17 之前版本沒影響&#xff0…

【CH32V305FBP6】USBD HS 虛擬串口分析

文章目錄 前言分析端點 0USBHS_UIS_TOKEN_OUT 端點 2USBHS_UIS_TOKEN_OUTUSBHS_UIS_TOKEN_IN 前言 虛擬串口&#xff0c;端口 3 單向上報&#xff0c;端口 2 雙向收發。 分析 端點 0 USBHS_UIS_TOKEN_OUT 設置串口參數&#xff1a; 判斷 USBHS_SetupReqCode CDC_SET_LIN…

玩轉HarmonyOS NEXT之配置文件篇

配置文件概述 本文以Stage模型為例&#xff0c;詳細介紹了HarmonyOS NEXT應用的各種配置文件&#xff0c;這些配置文件會向編譯工具、操作系統和應用市場提供應用的基本信息。 在基于Stage模型開發的應用項目代碼下&#xff0c;都存在一個app.json5的配置文件、以及一個或者多…

從零開始實現大語言模型(一):概述

1. 前言 大家好&#xff0c;我是何睿智。我現在在做大語言模型相關工作&#xff0c;我用業余時間寫一個專欄&#xff0c;給大家講講如何從零開始實現大語言模型。 從零開始實現大語言模型是了解其原理及領域大語言模型實現路徑的最好方法&#xff0c;沒有之一。已有研究證明&…

《昇思25天學習打卡營第07天|函數式自動微分》

函數式自動微分 環境配置 # 實驗環境已經預裝了mindspore2.2.14&#xff0c;如需更換mindspore版本&#xff0c;可更改下面mindspore的版本號 !pip uninstall mindspore -y !pip install -i https://pypi.mirrors.ustc.edu.cn/simple mindspore2.2.14 import numpy as np imp…

Windows10錄屏,教你3個方法,簡單快速錄屏

“我的電腦系統是Windows10的系統&#xff0c;今晚要進行線上開會&#xff0c;但我實在有事沒辦法參加會議&#xff0c;想把會議的內容錄制下來方便我后續觀看。但卻找不到電腦錄屏功能在哪里打開&#xff1f;求助一下&#xff0c;誰能幫幫我&#xff1f;” 在數字化時代&…

mysql 命令 —— 查看表信息(show table status)

查詢表信息&#xff0c;如整個表的數據量大小、表的索引占用空間大小等 1、查詢某個庫下面的所有表信息&#xff1a; SHOW TABLE STATUS FROM your_database_name;2、查詢指定的表信息&#xff1a; SHOW TABLE STATUS LIKE your_table_name;如&#xff1a;Data_length 顯示表…

閑聊 .NET Standard

前言 有時候&#xff0c;我們從 Nuget 下載第三方包時&#xff0c;會看到這些包的依賴除了要求 .NET FrameWork、.NET Core 等的版本之外&#xff0c;還會要求 .NET Standard 的版本&#xff0c;比如這樣&#xff1a; 這個神秘的 .NET Standard 是什么呢&#xff1f; .NET St…

【算法】字母異位詞分組

題目&#xff1a;字母異位詞分組 給你一個字符串數組&#xff0c;請你將 字母異位詞 組合在一起。可以按任意順序返回結果列表。 字母異位詞 是由重新排列源單詞的所有字母得到的一個新單詞。 示例 1: 輸入: strs [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”] …

從零開始搭建spring boot多模塊項目

一、搭建父級模塊 1、打開idea,選擇file–new–project 2、選擇Spring Initializr,選擇相關java版本,點擊“Next” 3、填寫父級模塊信息 選擇/填寫group、artifact、type、language、packaging(后面需要修改)、java version(后面需要修改成和第2步中版本一致)。點擊“…

【0300】Postgres內核動態哈希表實現機制(1)

相關文章&#xff1a; 【0299】Postgres內核之哈希表&#xff08;Hash Tables&#xff09; 0 概述 在【0299】Postgres內核之哈希表&#xff08;Hash Tables&#xff09;一文中&#xff0c;講解了哈希表的作用、實現、優缺點等特性。本文開始&#xff0c;將詳細分析Postgres內…

MySQL之應用層優化(三)

應用層優化 應用層緩存 2.本地共享內存緩存 這種緩存一般是中等大小(幾個GB)&#xff0c;快速&#xff0c;難以在多臺機器間同步。它們對小型的半靜態位數據比較合適。例如每個州的城市列表&#xff0c;分片數據存儲的分區函數(映射表)&#xff0c;或者使用存活時間(TTL)策略…

記錄一次Chrome瀏覽器自動排序ajax請求的JSON數據問題

文章目錄 1.前言2. 為什么會這樣&#xff1f;3.如何解決&#xff1f; 1.前言 作者作為新人入職的第一天&#xff0c;mentor給了一個維護公司運營平臺的小需求&#xff0c;具體需求是根據運營平臺的某個管理模塊所展示記錄的某些字段對展示記錄做排序。 第一步&#xff1a; myb…

工業觸摸一體機優化MES應用開發流程

工業觸摸一體機在現代工業生產中扮演著至關重要的角色&#xff0c;它集成了智能觸摸屏和工業計算機的功能&#xff0c;廣泛應用于各種生產場景中。而制造執行系統&#xff08;MES&#xff09;作為工業生產管理的重要工具&#xff0c;對于提高生產效率、降低成本、優化資源利用具…

力扣hot100-普通數組

文章目錄 題目&#xff1a;最大子數組和方法1 動態規劃方法2 題目&#xff1a;合并區間題解 題目&#xff1a;最大子數組和 原題鏈接&#xff1a;最大子數組和 方法1 動態規劃 public class T53 {//動態規劃public static int maxSubArray(int[] nums) {if (nums.length 0…

C++基礎知識-編譯相關

記錄C語言相關的基礎知識 1 C源碼到可執行文件的四個階段 預處理(.i)、編譯(.s)、匯編(.obj)、鏈接。 1.1 預處理 預處理階段&#xff0c;主要完成宏替換、文件展開、注釋刪除、條件編譯展開、添加行號和文件名標識&#xff0c;輸出.i/.ii預處理文件。 宏替換&#xff0c;…

【UML用戶指南】-26-對高級行為建模-狀態圖

目錄 1、概念 2、組成結構 3、一般用法 4、常用建模技術 4.1、對反應型對象建模 一個狀態圖顯示了一個狀態機。在為對象的生命期建模中 活動圖展示的是跨過不同的對象從活動到活動的控制流 狀態圖展示的是單個對象內從狀態到狀態的控制流。 在UML中&#xff0c;用狀態圖…