为什么Linux下C语言TLS比pthread_once更高效?内核开发者告诉你答案

第一章:C 语言中多线程的线程局部存储

在多线程编程中,多个线程共享同一进程的全局变量和静态变量,这可能导致数据竞争和同步问题。为避免此类问题,C11 标准引入了线程局部存储(Thread-Local Storage, TLS)机制,允许每个线程拥有独立的变量实例。通过 _Thread_local 关键字,开发者可以声明线程局部变量,这些变量在每个线程中独立存在且互不干扰。

线程局部存储的声明与使用

使用 _Thread_local 修饰符可定义线程局部变量,通常与 static 或 extern 结合使用。以下示例展示了如何在多线程环境中使用线程局部变量:
#include <stdio.h>
#include <threads.h>

_Thread_local int thread_local_counter = 0; // 每个线程拥有独立副本

int thread_func(void *arg) {
    for (int i = 0; i < 3; ++i) {
        ++thread_local_counter;
        printf("Thread %ld: counter = %d\n", (long)arg, thread_local_counter);
    }
    return 0;
}

int main() {
    thrd_t t1, t2;
    thrd_create(&t1, thread_func, (void*)1);
    thrd_create(&t2, thread_func, (void*)2);
    thrd_join(t1, NULL);
    thrd_join(t2, NULL);
    return 0;
}
上述代码中,每个线程对 thread_local_counter 的修改不会影响其他线程的值,输出将显示各自独立的计数过程。

线程局部存储的优势与适用场景

  • 避免全局状态污染,提升程序模块化程度
  • 减少锁竞争,提高并发性能
  • 适用于保存线程私有上下文信息,如错误码、内存池等
特性说明
生命周期随线程创建而初始化,随线程结束而销毁
初始化支持静态初始化,不支持动态运行时指定初始值
内存位置存储在线程栈或TLS段中,非共享堆区

第二章:线程局部存储(TLS)的核心机制

2.1 TLS 的基本概念与编译器支持

TLS(Thread Local Storage,线程局部存储)是一种用于为每个线程提供独立变量副本的机制,避免多线程环境下的数据竞争。
编译器对 TLS 的支持
主流编译器通过关键字或属性实现 TLS。例如,在 GCC 和 Clang 中可使用 __thread:
__thread int thread_local_data = 0;
该声明确保每个线程拥有独立的 thread_local_data 实例,初始化仅发生一次。相比 POSIX 的 pthread_key_t 接口,__thread 更高效,访问接近普通全局变量。
跨平台兼容性
不同平台支持方式各异:
  • Windows 使用 __declspec(thread)
  • C++11 引入标准关键字 thread_local
  • Clang/GCC 兼容多种语法
现代编译器在生成代码时将 TLS 变量置于特定节区(如 .tdata),由运行时系统在创建线程时自动初始化。

2.2 __thread 与 thread_local 关键字详解

在C/C++多线程编程中,`__thread` 和 `thread_local` 是用于声明线程局部存储(TLS)的关键机制,确保每个线程拥有变量的独立实例。
关键字对比与使用场景
  • __thread 是GCC提供的编译器扩展,兼容性有限,仅支持POD类型;
  • thread_local 是C++11引入的标准关键字,适用于类类型、全局及局部静态变量,具备更广适用性。
代码示例与分析

thread_local int tls_value = 0;
__thread int gcc_tls = 1;

void increment() {
    tls_value++;
    gcc_tls++;
}
上述代码中,tls_value 被所有线程各自持有副本,调用 increment() 不会影响其他线程的值。其中 thread_local 更推荐用于现代C++项目,因其标准化和构造/析构语义支持更完善。

2.3 TLS 在进程内存布局中的位置分析

在现代操作系统中,线程局部存储(TLS)用于为每个线程维护独立的数据副本。其数据通常位于线程栈附近或特定的TLS段中,由编译器和运行时系统协同管理。
内存布局结构
典型的进程内存布局中,TLS 数据区位于堆与栈之间,由动态链接器在加载时分配。每个线程拥有独立的 TLS 实例,确保数据隔离。
内存区域说明
.tdata初始化的 TLS 变量
.tbss未初始化的 TLS 变量
TLS 模板主线程的初始值模板
代码示例与分析

__thread int counter = 0; // 声明线程局部变量
void increment() {
    counter++;
}
该代码声明了一个线程局部整型变量 counter,每个线程调用 increment() 时操作的是自身栈上的副本,避免竞争。编译器将其放入 .tdata 或 .tbss 段,并通过 GOT 和 TLS 描述符在运行时定位实际地址。

2.4 动态链接库中 TLS 的初始化过程

在动态链接库(DLL)加载过程中,线程局部存储(TLS)的初始化由操作系统和PE加载器协同完成。当DLL被映射到进程地址空间时,加载器会检查其PE头中的TLS目录表(IMAGE_DIRECTORY_ENTRY_TLS),并根据其中的回调函数指针执行初始化逻辑。
TLS 回调函数机制
Windows支持通过TLS回调函数实现自定义初始化行为。这些回调函数在每个线程创建和销毁时被调用,确保线程私有数据的正确分配与释放。

// 示例:TLS 回调函数声明
#pragma comment(linker, "/INCLUDE:_tls_used")
void NTAPI TLSCallback(PVOID DllBase, DWORD Reason, PVOID Reserved) {
    if (Reason == DLL_THREAD_ATTACH) {
        // 线程附加时初始化TLS数据
    }
}
上述代码注册了一个TLS回调函数,在线程启动时触发初始化操作。参数DllBase指向DLL基址,Reason指示当前事件类型(如线程附加、分离等)。
初始化流程顺序
  • PE加载器解析TLS目录信息
  • 为当前线程分配TLS槽位
  • 调用所有注册的TLS回调函数
  • 完成线程上下文设置

2.5 TLS 性能优势的底层原因剖析

TLS 的性能优势源于其在加密层与传输层之间的高效协同机制。通过会话复用(Session Resumption)和预共享密钥(PSK),减少了完整握手的频率,显著降低延迟。
会话复用机制
  • 简化握手过程,避免重复的非对称加密运算
  • 支持会话票据(Session Tickets)实现无状态恢复
加密算法优化
现代 TLS 使用椭圆曲线加密(ECC),相比 RSA 更短的密钥即可提供同等安全性。例如:
// 示例:使用 TLS 1.3 和 ECDHE 密钥交换
config := &tls.Config{
    MinVersion:   tls.VersionTLS13,
    CurvePreferences: []tls.Curve{tls.CurveP256},
}
该配置优先选择 P-256 曲线,提升密钥协商效率。ECDHE 实现前向安全的同时,计算开销更低。
数据压缩与分帧
TLS 记录层将数据分帧处理,结合 AEAD 算法(如 AES-GCM)实现加密与完整性校验一体化,减少处理步骤,提升吞吐量。

第三章:pthread_once 的实现原理与局限

3.1 pthread_once 的语义与典型使用场景

pthread_once 是 POSIX 线程库中用于确保某段代码在多线程环境下仅执行一次的同步机制。其核心语义由 pthread_once_t 控制变量和初始化函数共同实现,无论多少线程调用,目标函数只会被真正执行一次。

基本用法与代码示例

#include <pthread.h>

static pthread_once_t once_control = PTHREAD_ONCE_INIT;
static void init_routine(void) {
    // 初始化逻辑:如创建单例、设置全局状态
}

void safe_init(void) {
    pthread_once(&once_control, init_routine);
}

上述代码中,once_control 初始化为 PTHREAD_ONCE_INIT,所有线程调用 safe_init 时,init_routine 保证只执行一次。参数说明:&once_control 是控制变量地址,init_routine 是无参无返回值的初始化函数。

典型应用场景
  • 单例对象的线程安全初始化
  • 全局资源(如日志器、配置管理器)的一次性配置
  • 动态库加载时的首次环境设置

3.2 互斥锁+标志位的经典实现机制

数据同步机制
在并发编程中,互斥锁与标志位结合使用是一种经典且高效的线程安全控制方式。通过互斥锁保护共享标志位的读写操作,可避免竞态条件。
  • 互斥锁确保同一时间只有一个线程能修改标志位
  • 标志位用于表示资源状态或任务完成情况
var (
    mu     sync.Mutex
    done   bool
)

func setData() {
    mu.Lock()
    defer mu.Unlock()
    if !done {
        // 执行初始化逻辑
        done = true
    }
}
上述代码中,mu 保护 done 标志位的访问。首次调用时设置状态,后续调用因标志位已变更而跳过初始化逻辑,确保操作仅执行一次。
典型应用场景
该模式广泛应用于单例初始化、一次性任务调度等场景,是构建可靠并发控制结构的基础组件。

3.3 上下文切换与竞争开销的实际测量

在高并发系统中,上下文切换和资源竞争是影响性能的关键因素。通过实际测量可量化其开销,进而优化线程模型。
使用 perf 工具测量上下文切换
Linux 提供的 perf 工具可用于统计进程/线程的上下文切换次数:

perf stat -e context-switches,cpu-migrations ./your_concurrent_program
该命令输出程序运行期间的上下文切换总数和 CPU 迁移次数。频繁的切换通常意味着线程过多或锁竞争激烈。
竞争开销的对比实验
以下是在不同线程数下测得的上下文切换与吞吐量关系:
线程数上下文切换次数(万/秒)吞吐量(请求/秒)
41.285,000
168.792,000
6442.368,000
当线程数超过 CPU 核心数时,切换开销显著上升,导致吞吐量下降。合理控制并发度是优化关键。

第四章:TLS 与 pthread_once 的对比实践

4.1 基准测试环境搭建与性能指标定义

为确保测试结果的可重复性与准确性,基准测试环境需在受控条件下构建。测试平台采用Ubuntu 22.04 LTS操作系统,CPU为Intel Xeon Gold 6330(2.0 GHz, 24核),内存128GB DDR4,存储使用NVMe SSD,网络环境为千兆以太网。
测试环境配置清单
  • 操作系统:Ubuntu 22.04 LTS
  • CPU:Intel Xeon Gold 6330 ×2
  • 内存:128GB ECC RAM
  • 磁盘:2TB NVMe SSD(顺序读取6.0 GB/s)
  • 网络:1Gbps LAN,延迟<0.1ms
关键性能指标定义
指标定义测量工具
吞吐量单位时间内处理的请求数(QPS/TPS)Apache Bench, wrk
响应延迟P50、P95、P99响应时间(ms)Prometheus + Grafana
资源利用率CPU、内存、I/O使用率top, iostat, vmstat
压力测试脚本示例

# 使用wrk进行HTTP压测
wrk -t12 -c400 -d30s --latency http://localhost:8080/api/v1/data
该命令启动12个线程,建立400个持久连接,持续压测30秒,并收集延迟数据。参数说明:-t表示线程数,-c为并发连接数,-d设定测试时长,--latency启用详细延迟统计。

4.2 高并发场景下的延迟与吞吐量对比

在高并发系统中,延迟与吞吐量是衡量性能的核心指标。延迟指请求从发出到收到响应的时间,而吞吐量表示单位时间内系统处理的请求数量。
典型性能特征对比
  • 低延迟通常意味着更快的响应,但可能牺牲吞吐量;
  • 高吞吐量系统常通过批量处理提升效率,但可能增加平均延迟。
基准测试数据
并发数平均延迟(ms)吞吐量(req/s)
100128,200
1,0004522,000
5,00012035,000
异步处理优化示例
func handleRequest(ch <-chan *Request) {
    for req := range ch {
        go func(r *Request) {
            r.Process()
            r.Done()
        }(req)
    }
}
该模型通过Goroutine实现非阻塞处理,提升吞吐量。通道(chan)控制请求流入,避免资源过载,平衡延迟与系统承载能力。参数ch为请求队列,每个请求独立协程处理,适用于I/O密集型场景。

4.3 内存占用与初始化开销实测分析

在服务启动阶段,不同序列化方案对内存的消耗存在显著差异。通过 JVM 堆监控工具采集初始化期间的峰值内存使用情况,发现 Protobuf 因预加载描述符和静态注册机制,初始堆占用高出 JSON 约 35%。
典型序列化框架内存对比
框架初始化内存 (MB)冷启动时间 (ms)
JSON48120
Protobuf65180
FlatBuffers5295
Protobuf 初始化代码示例

// 静态块触发描述符加载
static {
    DescriptorProtos.getDescriptor(); // 加载元数据树
    ExtensionRegistry registry = ExtensionRegistry.newInstance();
    registry.add(MyMessage.myField);
}
上述静态初始化导致类加载时即解析完整 proto 描述树,增加 GC 压力。相比之下,JSON 序列化按需解析,延迟开销更优但运行时成本更高。

4.4 内核开发者视角的优化建议总结

减少上下文切换开销
频繁的进程切换会显著影响系统性能。内核开发者应优化调度器策略,避免不必要的抢占。
  • 使用批处理方式合并小任务
  • 提升关键线程的调度优先级
  • 通过CPU亲和性绑定减少缓存失效
内存访问局部性优化
数据结构设计需考虑缓存行对齐,防止伪共享问题。
struct aligned_data {
    char name[64];      // 占用一整行缓存
    int count __attribute__((aligned(64)));
} __attribute__((aligned(64)));
该结构体通过__attribute__((aligned(64)))确保跨缓存行对齐,避免多核竞争时的缓存行乒乓效应,提升并发读写效率。

第五章:总结与展望

技术演进中的实践挑战
在微服务架构的落地过程中,服务间通信的稳定性成为关键瓶颈。某电商平台在大促期间因服务雪崩导致订单系统瘫痪,最终通过引入熔断机制与限流策略恢复稳定性。
  • 使用 Hystrix 实现服务隔离与降级
  • 基于 Sentinel 动态配置流量控制规则
  • 通过 Prometheus + Grafana 构建实时监控看板
代码层面的优化实例
以下 Go 语言示例展示了如何在 HTTP 客户端中集成超时控制,防止长阻塞引发级联故障:

client := &http.Client{
    Timeout: 3 * time.Second,
    Transport: &http.Transport{
        MaxIdleConns:        100,
        IdleConnTimeout:     30 * time.Second,
        TLSHandshakeTimeout: 5 * time.Second,
    },
}
// 发起请求时避免默认无限等待
resp, err := client.Get("https://api.example.com/status")
未来架构趋势的应对策略
技术方向当前应用案例企业准备度
Service Mesh某金融公司采用 Istio 管理 200+ 微服务高(已试点)
Serverless图像处理平台按调用计费,成本下降 60%中(探索阶段)
[API Gateway] --(gRPC)-> [Auth Service] \--(HTTP)-> [User Profile] `--(MQ)-> [Event Bus]
Picture of ssh key 立即下载

相关推荐

政府科技管理者如何提升区域科技成果转化项目的评价与筛选效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

linux C/C++ -- TLS

Linux TLS(Thread Local Storage) 翻译过来就是线程本地存储。 函数 #include <pthread.h> int pthread_key_create(pthread_key_t *key, void (*destructor)(void*)); void *pthread_getspecific(pthread_key_t key); int pthread_setspecific(pthread_key_t key, const void *value);

liuzhengzlh的博客 1981

高校技术转移办公室人员在成果转化过程中如何快速提升技术推介效率?.docx

科易网基于AI模型+行业大数据,在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,推出科技创新领域的AI+工具与数智化解决方案,推动科技创新与产业创新智能化发展。

Linux C语言程序中线程本地存储变量的内存分配和使用

在多线程中,有一种叫线程本地存储(Thread-Local Storage,TLS)的变量,它是每个线程有且只有一份自己的副本,对于这个线程来说,它是全局变量,可被所有函数共用;因为每个线程都有自己的一份内存来存储这些变量,所以线程之间不会相互干扰。TLS变量的内存分配和释放是由操作系统自动管理的,程序员无需手动分配和释放内存。同时,由于每个线程都有自己独立的一份副本,因此TLS变量的读写不需要加锁,可以提高多线程程序的性能。邀请您加入「社区资讯服务」创业微信群,共同探讨打造社区资讯服务的美好未来。

qiuzen的博客 1335

两相交错并联Boost电路仿真模型(Simulink仿真实现)

内容概要:本文档系统性地介绍了基于Simulink平台的两相交错并联Boost电路仿真模型,属于电力电子变换器建模与仿真研究的重要组成部分。该模型采用交错并联结构,有效提升了系统效率、降低了输出电流纹波,并具备优良的动态响应与系统稳定性。文档不仅聚焦于该特定拓扑的开环与闭环控制实现,还整合了丰富的配套资源,涵盖多种主流DC-DC变换器(如Buck、Boost、LLC、CLLC)、功率因数校正(PFC)电路、PWM整流器、双向充放电系统以及新能源应用场景(如V2G、微电网)等领域的仿真模型。资源体系强调软开关技术、多相交错控制、系统级建模与参数优化设计,所有内容均提供可运行的Simulink仿真文件,部分包含详细的设计报告、计算书及参考文献,具有较强的工程实践与科研复现价值。; 适合人群:电气工程、自动化、电力电子与电力传动等相关专业的硕士博士研究生、高校科研人员,以及从事新能源发电、电动汽车、电源系统设计等领域的工程技术人员。; 使用场景及目标:①支撑高校电力电子与电力系统方向的科研项目,用于新型拓扑结构的建模与先进控制算法的验证;②服务于本科生与研究生的毕业设计、课程设计及高水平学术论文的仿真复现;③为企业在电源产品研发、新能源系统集成等环节提供成熟的仿真方案参考,缩短研发周期,降低试错成本。; 阅读建议:建议使用者首先访问文档末尾提供的完整资源目录链接,按需下载对应仿真模型;在实践过程中,应重点关注模型的参数配置、控制策略实现细节与仿真工况设置,结合配套的说明文档深入理解其工作原理与设计思路,推荐在MATLAB/Simulink环境中动手调试与二次开发,以充分掌握电力电子系统的核心技术。

怎么定位K8s容器中运行的JAVA程序OOM异常(一)

一.前置环境 1. 运行在k8s集群上的Pod服务(Java程序) 2. MAT分析工具 二.利用Jmap工具导出Heap Dump 1.执行命令进入pod容器 kubectl exec -itn {namespace} {pod}} sh 2.利用jmap生成java程序的Dump文件 jps | grep {jar} ./jmap -dump:live,format=b,file=haep.hprof 8 3.利用k8s命令导出Dump文件到本地 kubectl cp -n

计算科学 3013

linux c 线程本地存储,TLS(线程本地存储)

TLS是一种在多线程时使用的技术,它可以使你的全局变量、静态变量以及局部静态、静态成员变量成为线程独立的变量,即每个线程的TLS变量之间互不影响。例如linux下的全局变量 errno,windows下的GetLastError ,线程A在设置了一个错误信息后,线程B又设置了一个错误信息,前一个线程设置的信息就被覆盖了。解决方法就是将这个全局变量设置为TLS变量,这样在用户看来errno是一个全局...

weixin_30830643的博客 673

ai获客系统功能代码

AI 获客系统是一个复杂的体系,以下为你提供一个简化的 Python 示例,聚焦于客户行为分析与销售线索筛选功能,模拟实现从多渠道收集数据后的初步处理流程。假设已有从官网、线上商城等渠道收集到的客户数据,以字典列表形式存储,每个字典包含客户基本信息及购买行为数据。通过分析客户购买频率与金额,筛选出高价值销售线索。python上述代码仅为基础示例,实际 AI 获客系统还涉及更复杂的数据采集、清洗、存储,以及运用机器学习算法进行深度客户洞察等功能。

weixin_ggwwsscc的博客 892

linux网络编程-tls客户端(持续更新)

主要用于SSL握手前的环境准备,设置CA文件和目录、设置SSL握手中的证书文件和私钥、设置协议版本以及其他一些SSL握手时的选项,多个连接可共用一个SSL_CTX对象。

weixin_43074937的博客 1394

拆开一个烧坏的IGBT模块,手把手教你识别过压、过流、过温的“案发现场”

本文详细解析了IGBT模块失效分析的实战技巧,通过观察铝层熔化纹路、焊锡溢出形态等物理痕迹,手把手教你识别过压、过流、过温的典型失效模式。文章提供了从基础工具包到现场快速诊断的完整流程,帮助工程师精准定位IGBT模块失效的根本原因。

weixin_30655569的博客 425

Java utgard连接OPC问题记录

怎么开启是个问题, 是在引入openscada的jar包里的Sever类中修改,这就犯难了, 其实没必要, 只要在自己项目下创建与openscada中Server类相同的路径,并复制Server过去改就行了, 项目会优先使用本地类,像下面这样。奇迹发生了,0x00000005解决. 注: 我的安全补丁编码跟网上查到的并不一样, 所以最初没有删,后来全都删了就好了,这个编码规则咱也不知道.安全日志中记录用户登录行为, OPC通信需要使用Windows系统用户进行登录, 如果用户名密码错误这里会有相关记录.

wangxin1949的博客 2840

linux TLS

TLS  即线程局部存储 作用就是:一些变量在一个线程中是全局的且归该线程独自所有,其他线程无法共享。 参考文献:http://baike.baidu.com/view/598128.htm http://topic.youkuaiyun.com/t/20030226/12/1467829.html

xiaocaichonga的专栏 740

地球引擎初级教程:Python API 的安装和介绍

地球引擎的 Python API 提供了许多功能和工具,用于访问和处理地理空间数据。连接到地球引擎在编写地球引擎的 Python 脚本时,首先需要连接到地球引擎服务器。import ee # 初始化地球引擎 ee . Initialize()这将初始化地球引擎并建立与服务器的连接。加载和显示图像使用地球引擎的 Python API,您可以加载和显示卫星图像。import ee# 初始化地球引擎# 加载 Landsat 8 影像# 显示影像print('影像 URL:', url)

UePostscript的博客 1007

linux c tls无锁日志,高效C 无锁队列实现(转载)

国外一牛人做的,支持多平台,支持多线程写、多线程读,并可指定读写token,转载过来。感觉作者也时刻维护着他这个项目,我提了一些问题,每次都会及时得到答复,而且回复得非常认真仔细,非常赞!moodycamel::ConcurrentQueueAn industrial-strength lock-free queue for C++.Note: If all you need is a singl...

weixin_39942191的博客 505

在 Zynq 7010 上运行 VxWorks 7.0 的详细流程【持续更新】

本文介绍了在Zynq 7010开发板上运行VxWorks 7.0的完整流程。主要包括:1)使用Vivado创建硬件设计,配置Zynq模块并生成比特流文件;2)通过Workbench 4创建VxWorks工程,配置启动参数并生成镜像;3)下载运行步骤。此外还讲解了使用Workbench 4开发VSB和VIP工程的方法,包括工程创建、配置和调试流程。文中提供了关键操作截图和注意事项,为开发者提供了完整的Zynq 7010平台VxWorks开发解决方案。

weixin_45397344的博客 1223

使用 ABAP 代码动态创建新的 Function Module

通过内表。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 6906

SSL握手通信详解及linux下c/c++ SSL Socket代码举例

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34233856的博客 656

大学计算 - NumPy库的矩阵运算 实训答案

本文介绍了三个NumPy矩阵操作的实验练习。第一关练习ndarray类型操作,包括矩阵构造、元素平方和计算、矩阵乘积运算和逆矩阵行列式计算;第二关针对matrix类型,涉及绝对值最大值获取、特定矩阵乘积运算和转置矩阵特征值计算;第三关实现Moore-Penrose伪逆矩阵计算,并与NumPy内置pinv函数结果比较误差。实验涵盖了NumPy核心矩阵操作,展示了从基础运算到高级矩阵分解的应用,帮助掌握科学计算中的矩阵处理技巧。

2403_89314916的博客 310

linux安全和加密之SSL\TLS协议、CA、openssl的概述和使用

内容:1、通信加密类型及算法2、TLS/SSL协议的引入及其通信过程3、CA、数字签名的引入4、一个安全的数据通信交换过程5、openssl工具的使用6、自制私有根CA过程一、通信加密类型及算法数据加密通信的重要性不言而喻,美国NIST,为了保证计算机的安全,提出了几个要求:(1)、数据要有保密性:数据保密性和隐私性;确保信息不被别人获取,个人存储的信息不能被...

weixin_33766168的博客 655

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Linux中TLS

TLS(Thread Local Storage) 线程局部存储。 在Linux操作系统中,TLS保存成GDT中描述的一个段。 1: /* 2: * This creates a new process as a copy of the old one, 3: * but does not actually start it yet. 4: * 5: * I...

weixin_34082789的博客 1414

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

ssl跟tls的区别

SSL(Secure Socket Layer 安全套接层)是基于HTTPS下的一个协议加密层,最初是由网景公司(Netscape)研发,后被IETF(The Internet Engineering Task Force - 互联网工程任务组)标准化后写入(RFCRequest For Comments 请求注释),RFC里包含了很多互联网技术的规范! 起初是因为HTTP在传输数据时使用的是明文(虽然说POST提交的数据时放在报体里看不到的,但是还是可以通过抓包工具窃取到)是不安全的,为了解决这一隐患网景

linux_tcpdump的博客 314

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

关于Linux线程的线程栈以及TLS

说明: a.本文描述Linux NPTL的线程栈简要实现以及线程本地存储的原理,实验环境中Linux内核版本为2.6.32,glibc版本是2.12.1,Linux发行版为ubuntu,硬件平台为x86的32位系统。b.对于Linux NPTL线程,有很多话题。本文挑选了原则上是每线程私有的地址空间来讨论,分别是线程栈和TLS。原则山私有并不是真的私有,因为大家都知道线程的特点就是共享地址空间,原...

系统运维 470

SSL握手通信详解及linux下c/c++ SSL Socket(另附SSL双向认证客户端代码)

SSL(Secure Sockets Layer 安全套接层),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密。   安全证书既包含了用于加密数据的密钥,又包含了用于证实身份的数字签名。安全证书采用公钥加密技术。公钥加密是指使用一对非对称的密钥进行加密或解密。每一对密钥由公钥

轻飘飞扬 3万+

聊聊Linux中的线程本地存储(1)——什么是TLS

什么是线程本地存储(TLS,Thread Local Storage)呢?相信你看过很多次这个定义,但它表达的内涵是什么呢?本文从变量模型出发,讨论引入多线程编程模式之后,需要重新修改变量模型,从而引入TLS概念。

海枫的专栏 1万+
上一篇: 你真的懂HTTP状态码吗?C语言级解析带你穿透网络协议本质
下一篇: 【时间序列分析必备技能】:Pandas重采样频率应用全解析
DevPath
博客等级 码龄1年 179粉丝 2176原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值