当前位置: 首页 > news >正文

C/C++线程详解

一、C语言线程创建(POSIX线程)

1. 基本创建方法

POSIX线程(pthread)是C语言中创建线程的标准API:

#include <pthread.h>
#include <stdio.h>void* thread_func(void* arg) {printf("Thread running with arg: %d\n", *(int*)arg);return NULL;
}int main() {pthread_t tid;int arg = 42;// 创建线程int ret = pthread_create(&tid, NULL, thread_func, &arg);if (ret != 0) {perror("pthread_create failed");return 1;}// 等待线程结束pthread_join(tid, NULL);return 0;
}

2. 关键参数说明

  • pthread_t *thread:存储线程ID的指针
  • const pthread_attr_t *attr:线程属性(NULL表示默认)
  • void *(*start_routine)(void*):线程函数指针
  • void *arg:传递给线程函数的参数

3. 线程属性设置

pthread_attr_t attr;
pthread_attr_init(&attr);  // 初始化属性
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); // 设置分离属性
pthread_create(&tid, &attr, thread_func, NULL);
pthread_attr_destroy(&attr); // 销毁属性对象

二、C++线程创建(std::thread)

1. 基本创建方法

C++11引入了std::thread类简化线程创建:

#include <iostream>
#include <thread>void thread_function() {std::cout << "Thread function executing" << std::endl;
}int main() {// 创建并启动线程std::thread t(thread_function);// 等待线程结束t.join();return 0;
}

2. 多种创建方式

(1) 使用函数指针
void print_message(const std::string& msg) {std::cout << msg << std::endl;
}std::thread t1(print_message, "Hello from thread");
(2) 使用Lambda表达式
std::thread t2(‌:ml-search[]{std::cout << "Lambda thread running" << std::endl;
});

 

(3) 使用成员函数

class MyClass {
public:void member_func() {std::cout << "Member function thread" << std::endl;}
};MyClass obj;
std::thread t3(&MyClass::member_func, &obj);

3. 线程管理

  • join():等待线程结束
  • detach():分离线程(后台运行)
  • joinable():检查线程是否可join

三、C与C++线程创建对比

特性std::thread (C++11)pthread (POSIX)
标准化程度C++标准库的一部分POSIX标准,非C++原生
跨平台性所有支持C++11的平台主要类UNIX系统
接口风格面向对象(类+成员函数)C风格函数接口
线程创建构造函数直接启动线程需显式调用pthread_create
参数传递类型安全,支持任意可调用对象需通过void*指针强制转换
资源管理RAII自动管理(析构自动处理)需手动调用pthread_join/detach
错误处理异常机制返回值错误码
头文件<thread><pthread.h>
编译要求需支持C++11需链接-lpthread

四、实际应用示例

1. 多线程计算(C++)

#include <iostream>
#include <thread>
#include <vector>void compute(int start, int end, int& result) {int sum = 0;for (int i = start; i <= end; ++i) {sum += i;}result = sum;
}int main() {const int n = 1000;int result1, result2;std::thread t1(compute, 1, n/2, std::ref(result1));std::thread t2(compute, n/2+1, n, std::ref(result2));t1.join();t2.join();std::cout << "Total sum: " << result1 + result2 << std::endl;return 0;
}

2. 线程池基础(C)

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>#define THREAD_COUNT 4void* worker(void* arg) {int id = *(int*)arg;printf("Worker %d started\n", id);// 实际工作任务...printf("Worker %d finished\n", id);return NULL;
}int main() {pthread_t threads[THREAD_COUNT];int thread_ids[THREAD_COUNT];for (int i = 0; i < THREAD_COUNT; ++i) {thread_ids[i] = i;pthread_create(&threads[i], NULL, worker, &thread_ids[i]);}for (int i = 0; i < THREAD_COUNT; ++i) {pthread_join(threads[i], NULL);}return 0;
}

五、注意事项

  1. 资源管理‌:C++的std::thread使用RAII,析构时若未join/detach会terminate
  2. 参数生命周期‌:确保线程参数在线程使用期间有效
  3. 线程安全‌:共享数据需要同步机制(mutex等)
  4. 错误处理‌:C++使用异常,C检查返回值
  5. 平台差异‌:pthread在不同Unix-like系统实现可能不同

六、使用建议

  1. 优先使用std::thread的情况‌:

    • 开发跨平台应用
    • 需要与C++其他特性(如lambda、智能指针)集成
    • 希望简化资源管理
    • 项目已使用C++11或更高标准
  2. 可能需要使用pthread的情况‌:

    • 维护遗留代码
    • 需要特定POSIX线程特性(如优先级控制)
    • 在仅支持C的嵌入式环境中开发
    • 需要精细控制线程属性(虽然C++11也可通过native_handle实现)

七、性能注意事项

  1. 在主流平台上,两者性能差异通常小于%5,因为:

    • std::thread在Linux上实质是pthread的封装
    • 线程创建/切换等核心操作最终都调用相同的系统API
  2. 实际选择应更多考虑:

    • 代码可维护性
    • 与现有代码库的整合度
    • 团队熟悉程度
    • 长期维护成本

相关文章:

C/C++线程详解

一、C语言线程创建&#xff08;POSIX线程&#xff09; 1. 基本创建方法 POSIX线程&#xff08;pthread&#xff09;是C语言中创建线程的标准API&#xff1a; #include <pthread.h> #include <stdio.h>void* thread_func(void* arg) {printf("Thread runnin…...

动态ip与静态ip的概念、区别、应用场景

动态ip与静态ip的区别 前言 一、IP地址的概念和作用 1.1、IP地址的定义 1.2、IP地址的作用 二、动态IP和静态IP的区别 2.1、动态IP和静态IP的定义 2.2、动态IP和静态IP的特点 2.3、动态IP和静态IP的优缺点比较 三、动态IP和静态IP的应用场景 3.1. 动态IP的应用场景 3.2. 静态IP…...

P12167 [蓝桥杯 2025 省 C/Python A] 倒水

P12167 [蓝桥杯 2025 省 C/Python A] 倒水 题目描述 小蓝有 n n n 个装了水的瓶子&#xff0c;从左到右摆放&#xff0c;第 i i i 个瓶子里装有 a i a_i ai​ 单位的水。为了美观&#xff0c;小蓝将水循环染成了 k k k 种颜色&#xff0c;也就是说&#xff0c;第 i i i …...

Appium自动化开发环境搭建

自动化 文章目录 自动化前言 前言 Appium是一款开源工具&#xff0c;用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…...

【金仓数据库征文】金仓数据库:国产化浪潮下的技术突破与行业实践

目录 前言 技术突破&#xff1a;从追赶国际到引领创新 行业深耕&#xff1a;从医疗到航空航天的多领域落地 事务管理与ACID特性 事务管理概述 索引优化与性能调优 安全性与备份恢复策略 Json构造函数 总结 前言 在数字化转型的全球趋势下&#xff0c;数据库作为信息系…...

计算机操作系统

1. T0 时刻是否为安全状态&#xff1f; 步骤 1: 计算当前可用资源 总资源数量&#xff1a; A: 17B: 5C: 20 已分配资源&#xff1a; P1: (2, 1, 2)P2: (4, 0, 2)P3: (4, 0, 5)P4: (2, 0, 4)P5: (3, 1, 4) 当前可用资源&#xff1a; A: 17 - (2 4 4 2 3) 2B: 5 - (1 0 …...

linux系统问题杂谈

1.配置好anaconda之后&#xff0c;在一个终端中编辑好环境变量之后能够正常使用conda命令&#xff0c;但是新打开一个中断使用conda命令报错"无法识别conda"。 原因&#xff1a;使用“export PATH"/home/username/anaconda3/bin:$PATH"命令&#xff0c;临…...

百度打响第一枪!通用超级智能体时代,真的来了

Create2025百度AI开发者大会在武汉举行&#xff0c;K哥受邀参加&#xff0c;看到了许多有趣的创新技术和产品。其中最令我印象深刻的是一款全新发布的通用超级智能体——心响App。 这款App通过多智能体复杂组合、协作&#xff0c;满足用户能够「一站式」解决复杂问题的使用诉求…...

FWFT_FIFO和Standard_FIFO对比仿真

在FPGA中使用FIFO时&#xff0c;如果使用FPGA厂商提供的FIFO IP&#xff0c;一般都会有First Word Fall Through FIFO和Standard FIFO类型选项&#xff0c;那么这两种FIFO有什么差异么。两种FIFO的端口是一样的&#xff0c;看不出区别&#xff0c;只有通过仿真&#xff0c;才能…...

【网络原理】TCP提升效率机制(二):流量控制和拥塞控制

目录 一. 前言 二. 流量控制 三. 拥塞控制 一. 前言 TCP的可靠传输依靠确认应答机制&#xff0c;超时重传机制是对确认应答的一种补充&#xff0c;解决了丢包问题 为了提高传输效率&#xff0c;避免大量的时间都浪费在等待应答的过程&#xff0c;故引入了滑动窗口机制&…...

DeepSeek+Cline:开启自动化编程新纪元

目录 一、引言&#xff1a;AI 编程时代的曙光二、认识 DeepSeek 和 Cline2.1 DeepSeek 是什么2.2 Cline 详解2.3 两者结合的魅力 三、DeepSeek Cline 安装与配置全流程3.1 安装 VS Code3.2 安装 Cline 插件3.3 获取 DeepSeek API Key3.4 配置 Cline 与 DeepSeek 连接 四、实战演…...

【RedisLockRegistry】分布式锁

RedisLockRegistry分布式锁 介绍 RedisLockRegistry‌是Spring框架提供的一种分布式锁机制&#xff0c;它基于Redis来实现对共享资源的保护&#xff0c;防止多个进程同时对同一资源进行修改&#xff0c;从而避免数据不一致或其他问题‌ 基本原理 RedisLockRegistry通过Redi…...

脚本批量启动Node服务器

创建文件start-projects.ps1 定义项目路径&#xff08;使用PowerShell中更可靠的路径表示方式&#xff09; $变量A “E:/XXXX文件根目录” $变量B “E:/XXXX” $变量C “E:/XXXX” 打开变量A并执行npm run dev Start-Process powershell -ArgumentList “-NoExit”, “-Com…...

使用命令行加密混淆C#程序

C#作为托管语言编译生成的IL中间代码极易被反编译工具还原源码。据统计&#xff0c;超过83%的商业软件曾遭遇过代码逆向风险&#xff0c;导致核心算法泄露、授权被跳过. 因此对于C#语言开发的程序来说, 在发布前进行混淆和加密非常有必要. 本文主要介绍如何使用恒盾C#混淆加密…...

零基础上手Python数据分析 (23):NumPy 数值计算基础 - 数据分析的加速“引擎”

写在前面 —— 超越原生 Python 列表,解锁高性能数值计算,深入理解 Pandas 的底层依赖 在前面一系列关于 Pandas 的学习中,我们已经领略了其在数据处理和分析方面的强大威力。我们学会了使用 DataFrame 和 Series 来高效地操作表格数据。但是,你是否好奇,Pandas 为何能够…...

深度学习实战106-大模型LLM+股票MCP Server的股票分析和投资建议应用场景

大家好,我是微学AI,今天给大家介绍一下深度学习实战106-大模型LLM+股票MCP Server的股票分析和投资建议应用场景。 文章目录 一、项目背景(一)大型语言模型(LLM)在金融领域的应用趋势(二)模型上下文协议(MCP)的兴起(三)大模型LLM+股票MCP服务的需求二、开发流程(…...

IDEA配置将Servlet真正布署到Tomcat

刚开始只能IDEA运行完Servlet web application 并保持IDEA运行才能通过浏览器访问到我的Servlet&#xff0c;跟想象中的不一样&#xff0c;不应该是IDEA运行完项目以后只要打开Tomcat就能访问吗&#xff1f;事实时运行完项目只要关掉IDEA就不能再访问到应用了&#xff0c;而且T…...

交叉编译paho.mqtt.c和paho.mqtt.cpp(MQTT客户端)

一、参考资料 【MQTT】paho.mqtt.cpp 库的 介绍、下载、交叉编译、MQTT客户端例子源码-CSDN博客 【MQTT】paho.mqtt.c 库的“介绍、下载、交叉编译” 详解&#xff0c;以及编写MQTT客户端例子源码-CSDN博客 二、准备工作 1. 重要说明 paho.mqtt.cpp与paho.mqtt.c&#xff…...

Prometheus中部署Alertmanager

部署Alertmanager 是 Prometheus 生态系统中的一个重要步骤&#xff0c;用于管理和处理 Prometheus生成的告警。Alertmanager和Prometheus Server一样均采用Golang实现&#xff0c;并且没有第三方依赖。一般来说我们可以通过以下几种方式来部署Alertmanager&#xff1a;二进制包…...

van-field组件设置为textarea属性被软键盘遮挡问题

在移动端van-field 输入框当type为text时&#xff0c;调出软键盘输入框会被顶上去&#xff0c;但type为textarea时不会被顶上去&#xff0c;可以用下面方法来实现&#xff1a; 1. 来2个van-field type为text的输入框z-index: 1 type为textarea的输入框z-index: 9999&#x…...

websheet之 编辑器

一、默认编辑器 该单元格编辑器是控件自带的编辑器&#xff0c;用户不需要指定。 二、下拉选择 该单元格编辑器是控件自带的编辑器的一种。该控件需要你指定下拉的数据源。在下面的例子中&#xff0c;我们给C3和C6单元格指定了币种的下拉选择编辑器。参数见&#xff1a;六、 参…...

氢气泄漏应急预案应包括哪些内容?

氢气泄漏应急预案是科研实验室中应对氢气泄漏事故的重要文件&#xff0c;其内容需要全面覆盖预防、检测、响应和善后处理等环节&#xff0c;确保在紧急情况下能够快速、有序地采取措施&#xff0c;最大限度地减少事故风险和损失。以下是氢气泄漏应急预案应包括的主要内容&#…...

【每天一个知识点】IPv4(互联网协议版本4)和IPv6(互联网协议版本6)

IPv4&#xff08;互联网协议版本4&#xff09;和IPv6&#xff08;互联网协议版本6&#xff09;是用于在互联网上标识和定位设备的两种主要协议。它们的主要区别在于地址空间、结构、以及一些附加功能。以下是两者的对比&#xff1a; 1. 地址长度 IPv4: 地址长度为32位&#xf…...

【高频考点精讲】前端构建工具对比:Webpack、Vite、Rollup和Parcel

前端构建工具大乱斗:Webpack、Vite、Rollup和Parcel谁是你的菜? 【初级】前端开发工程师面试100题(一) 【初级】前端开发工程师面试100题(二) 【初级】前端开发工程师的面试100题(速记版) 最近在后台收到不少同学提问:“老李啊,现在前端构建工具这么多,我该选哪个?…...

牛客小白月赛115-B题:签到题

题目传送门牛客网竞赛题目 一、题目描述 给定n道题目&#xff0c;每道题难度为aᵢ。要从中选出m道题组成比赛&#xff0c;使得难度最低的题目&#xff08;签到题&#xff09;数量尽可能多。求签到题的最大可能数量。 输入&#xff1a; 第一行两个整数n,m(1≤m≤n≤210⁵)第…...

【QQMusic项目复习笔记——音乐管理模块详解】第四章

&#x1f339; 作者: 云小逸 &#x1f91f; 个人主页: 云小逸的主页 &#x1f91f; motto: 要敢于一个人默默的面对自己&#xff0c;强大自己才是核心。不要等到什么都没有了&#xff0c;才下定决心去做。种一颗树&#xff0c;最好的时间是十年前&#xff0c;其次就是现在&…...

IPv6 技术细节 | 源 IP 地址选择 / Anycast / 地址自动配置 / 地址聚类分配

注&#xff1a;本文为 “IPv6 技术细节” 相关文章合集。 部分文章中提到的其他文章&#xff0c;一并引入。 略作重排&#xff0c;未整理去重。 如有内容异常&#xff0c;请看原文。 闲谈 IPv6 - 典型特征的一些技术细节 iteye_21199 于 2012-11-10 20:54:00 发布 0. 巨大的…...

代码随想录算法训练营day11(二叉树)

华子目录 翻转二叉树思路 对称二叉树思路 二叉树的最大深度思路 翻转二叉树 https://leetcode.cn/problems/invert-binary-tree/description/ 思路 采用递归的思路可以前序遍历和后序遍历&#xff0c;不能使用中序遍历 # Definition for a binary tree node. # class TreeNo…...

A Comprehensive Survey of Spoken Language Models

语音大语言模型&#xff08;Spoken Language Model, SLM&#xff09;正在引领人工智能领域的新一轮革新浪潮。正如文本自然语言处理从任务特定模型迈向通用大语言模型的演进&#xff0c;语音领域也正在经历类似转型。 为填补该领域系统性综述的空白&#xff0c;芝加哥大学、卡…...

深入解析 SMB 相关命令:smbmap、smbclient、netexec 等工具的使用指南

Server Message Block&#xff08;SMB&#xff09;协议是广泛应用于文件共享、打印机共享和进程间通信的网络协议&#xff0c;尤其在 Windows 环境中常见。渗透测试和网络安全审计中&#xff0c;SMB 是一个重要的攻击面&#xff0c;相关工具如 smbmap、smbclient 和 netexec 提…...

伊克罗德信息亮相亚马逊云科技合作伙伴峰会,以ECRobot 智能云迁移助手在GenAI Tech Game比赛勇夺金牌!

十年同行&#xff0c;共赴盛会&#xff1a;伊克罗德信息亮相2025亚马逊云科技Partner Summit 2025亚马逊云科技合作伙伴峰会&#xff08;AWS Partner Summit&#xff09;于乌镇盛大启幕&#xff0c;这场全球云计算领域的顶级盛会汇聚了亚马逊云科技全球核心合作伙伴、行业领袖与…...

【蓝桥杯】P12165 [蓝桥杯 2025 省 C/Java A] 最短距离

最短距离 题目描述 在一条一维的直线上&#xff0c;存在着 n n n 台显示器和 n n n 个电源插座。老师给小蓝布置了个任务&#xff1a;负责将每台显示器通过电源线与一个插座相连接&#xff08;每个插座最多只能给一台显示器供电&#xff09;&#xff1b;同时&#xff0c;老…...

深入浅出Sentinel:分布式系统的流量防卫兵

引言 在当今的微服务架构和分布式系统中&#xff0c;服务间的依赖关系错综复杂&#xff0c;一个服务的故障可能会像多米诺骨牌一样引发整个系统的崩溃。如何有效地保护系统免受突发流量、不稳定依赖服务的影响&#xff0c;成为每个架构师和开发者必须面对的挑战。今天&#xf…...

vite+vue2+elementui构建之 vite.config.js

webpack版本太低&#xff0c;构建依赖太多&#xff0c;头大。 各种查阅资料&#xff0c;弄了一份直通构建vite构建elementUi核心文件&#xff0c; 构建基于开源若依vue2vue3版本改造&#xff0c;感谢开源&#xff0c;感谢若依。 package.json 地址 vitevue2elementui构建之…...

【Pandas】pandas DataFrame radd

Pandas2.2 DataFrame Binary operator functions 方法描述DataFrame.add(other)用于执行 DataFrame 与另一个对象&#xff08;如 DataFrame、Series 或标量&#xff09;的逐元素加法操作DataFrame.add(other[, axis, level, fill_value])用于执行 DataFrame 与另一个对象&…...

Java 后端开发环境安装

Java环境安装 1. 安装程序 Java1.8下载&#xff0c;由于官网下载需要登录&#xff0c;比较麻烦&#xff0c;所以我将安装文件放到了我的资源中&#xff0c;大家通过资源直接下载即可 jdk-8u351-windows-x64.exe 大家根据自己的电脑的配置选择适当的版本 然后一路下一步 这里…...

Azure Data Factory ETL设计与调度最佳实践

一、引言 在Azure Data Factory (ADF) 中&#xff0c;调度和设计ETL&#xff08;抽取、转换、加载&#xff09;过程需要综合考量多方面因素&#xff0c;以确保数据处理高效、可扩展、可靠且易于维护。以下将详细介绍相关关键考虑因素、最佳实践&#xff0c;并辅以具体示例说明…...

【Mybatis】MyBatisPlus的saveBatch真的是批量插入吗?深度解析与性能优化

前言 在使用MyBatis-Plus进行批量数据插入时&#xff0c;许多开发者会发现&#xff1a;即使调用saveBatch方法&#xff0c;数据库仍会产生大量INSERT语句。本文将深入源码揭示背后的真相&#xff0c;并提供3种性能优化方案&#xff0c;让你的批量插入速度提升10倍&#xff01;…...

图像预处理-图像亮度变换

一.亮度变换 首先有两个关联的说法&#xff1a; 亮度调整&#xff1a;像素强度整体变高或者变低。 对比度调整&#xff1a;暗处像素强度变低&#xff0c;亮处像素强度变高&#xff0c;从而拉大中间某个区域范围的显示精度。 opencv中操作这两种变换的公式为&#xff1a; 对比…...

基于AI应用创业IDEA:使用百度搜索开放平台的MCP广场智能推荐MCPServices服务

基于AI应用创业IDEA&#xff1a;使用百度搜索开放平台的MCP广场智能推荐MCPServices服务 在当今快速发展的技术时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为推动各行各业创新的关键力量。特别是在创业领域&#xff0c;AI技术不仅能够帮助提升产品性能&#xf…...

URP-利用矩阵在Shader中实现物体的平移和缩放

一、平移 方法一&#xff1a; v.positionOS.xyz _Translate.xyz; 方法二&#xff1a; 利用矩阵实现平移&#xff1a; 二、缩放 方法一&#xff1a; v.positionOS.xyz * _Scale.xyz*_Scale.w; _Scale.w实现全局缩放 方法二&#xff1a; Shader"unity/Translation"…...

跟着尚硅谷学vue-day5

计算属性和watch监视 一.姓名案例 1.姓名案例-插值语法 <div id"root">姓&#xff1a;<input type"text" value"张" v-model"firstname"><br/><br/>名&#xff1a;<input type"text" value&q…...

猫咪如厕检测与分类识别系统系列【十三】猫咪进出事件逻辑及日志优化【下】

前情提要 家里养了三只猫咪&#xff0c;其中一只布偶猫经常出入厕所。但因为平时忙于学业&#xff0c;没法时刻关注牠的行为。我知道猫咪的如厕频率和时长与健康状况密切相关&#xff0c;频繁如厕可能是泌尿问题&#xff0c;停留过久也可能是便秘或不适。为了更科学地了解牠的如…...

【Java学习笔记】冒泡排序

冒泡排序 思想&#xff1a;经过一轮遍历比较&#xff0c;把最大的放在数组的末尾 int[] a {3, 2, 1}; for( int i 0; i < a.length-1; i){for( int j 0; j < a.length-1-i; j){if(a[j] > a[j1]){int temp a[j];a[j] a[j1];a[j1] temp;}} } for( int i 0; i &…...

【含文档+PPT+源码】基于微信小程序的校园快递平台

项目介绍 本课程演示的是一款基于微信小程序的校园快递平台&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附带…...

Vue3 自定义指令完全指南

Vue3 自定义指令完全指南 目录 基本概念指令注册方式常用应用场景注意事项 基本概念 在Vue3中&#xff0c;自定义指令是用于直接操作DOM的重要工具。相比Vue2&#xff0c;Vue3的指令系统进行了优化和简化。 生命周期钩子 钩子名称对应Vue2名称触发时机createdbind元素属性…...

神经辐射场(NeRF)技术解析:3D重建与虚拟世界的未来

神经辐射场&#xff08;NeRF&#xff09;技术解析&#xff1a;3D重建与虚拟世界的未来 ——从算法突破到元宇宙基础设施的演进之路 摘要 本文通过算法演进图谱、训练流程解析、PyTorch代码实战及产业应用洞察&#xff0c;构建从学术创新到工程落地的完整技术框架。实验数据显…...

050_基于springboot的音乐网站

一、系统架构 前端&#xff1a;vue | element-ui | html | jquery | css | ajax 后端&#xff1a;springboot | mybatis 环境&#xff1a;jdk1.8 | mysql | maven | nodejs | idea 二、代码及数据 三、功能介绍 01. web端-注册 02. web端-登录 03. web…...

Django之旅:第七节--模版继承

定义母版—new.html <!DOCTYPE html> <html lang"en"><head></head><body><div>{% block contents %}{% endblock %}</div></body> </html> 继承母模板 {% extends new.html %} {% block contents %}&…...

Windows 10 上运行 Ollama 时遇到 llama runner process has terminated: exit status 2

在 Windows 10 上运行 Ollama 时遇到 llama runner process has terminated: exit status 2 错误&#xff0c;可能是由多种原因引起的。以下是逐步解决方案&#xff1a; 1. 检查 Ollama 服务状态 按 Win R 输入 services.msc&#xff0c;找到 Ollama 服务&#xff0c;确保其状…...