C语言 线程创建与销毁基础接口(Windows & Linux)

C语言与应用开发 C语言基础知识、网络通信、嵌入式应用开发、进程、线程等相关知识总结 阅读详情

Linux篇

  • 创建线程:
int pthread_create(
    pthread_t *tidp, //线程ID
    const pthread_attr_t *attr, //线程属性
    (void*)(*start_rtn)(void*), //线程函数
    void *arg);//传递给线程的参数
返回值:
成功-返回0
失败-返回错误码
  • 线程属性
    线程默认属性是joinable, 需主线程阻塞回收;
    若创建线程时设置属性为detach, 或子线程主动调用pthread_detach(), 则在线程返回时操作系统回收资源.

  • 线程资源回收
    注: 主动回收只针对属性为joinable的线程, detach是系统回收, 即子线程结束, 资源就释放.

  • 1.主动回收线程资源:

 int pthread_join(pthread_t thread, void **retval);
/* 
DESCRIPTION
       The  pthread_join() function waits for the thread specified by thread to terminate.  If that thread has already terminated, then pthread_join() returns immediately.  The thread specified by thread must be joinable.

RETURN VALUE
       On success, pthread_join() returns 0; on error, it returns an error number.
 */
  • 2.系统回收线程资源:
    方法1.主线程开启子线程之前设置detach属性:
    pthread_t thread_id;
    pthread_attr_t attr;
    pthread_attr_init(&attr); pthread_attr_setdetachstate(&attr,PTHREAD_CREATE_DETACHED);
    pthread_create(&thread_id,&attr,start_run,NULL); //若attr为NULL, 则为默认属性
    pthread_attr_destroy(&attr);
    方法2.子线程退出前调用:pthread_detach()

  • 获取线程ID:

 pthread_t  pthread_self(void)

Windows篇

  • 创建:
LPDWORD lpThreadId = NULL;
HANDLE threadHandle = CreateThread(NULL, //属性
                                    0, //栈大小
                                    threadRoutine,//线程函数
                                    NULL, //函数传参
                                    0, //默认值, 表示线程立刻激活
                                    lpThreadId);//线程ID
  • 资源回收
(1).CloseHandle(HANDLE threadHandle):
    释放句柄可以是任何位置, 该函数是线程句柄引用计数减一, 减一之后线程不影响线程运行, 而是等线程返回后由操作系统回收.
(2).DWORD WaitForSingleObject(
                    HANDLE hObject, //句柄
                    DWORD dwMilliseconds //超时时间, 单位毫秒;INFINITE为无限时间(即阻塞回收),值为-1;
                );
  • 获取线程ID: GetCurrentThreadId()
Linux C语言TCP Socket编程:从基础API到多线程并发服务器实现 网络编程是计算机通信的基础,其核心在于理解操作系统如何通过协议栈实现进程间数据交换。TCP协议作为可靠的、面向连接的传输层协议,通过三次握手建立连接、流量控制和拥塞控制机制保证数据传输的可靠性。在Linux环境下,Socket API是网络编程的基石,开发者通过socket()、bind()、listen()、accept()、connect()等系统调用直接操作协议栈。掌握这些底层接口对于排查网络超时、连接重置、数据粘包等实际问题至关重要。在多线程并发模型中,通过pthread_create创建线程处理客 阅读详情

相关推荐

从零实现C语言多线程HTTP服务器:Socket编程与线程池实战

网络编程是构建现代互联网服务的基础,其核心在于理解客户端与服务器之间的通信机制。从原理层面看,服务器需要高效处理并发连接,避免因单个请求阻塞而影响整体性能。为实现这一目标,多线程模型成为关键技术,它通过创建多个工作线程并行处理请求,显著提升吞吐量。线程池技术进一步优化了这一过程,它预先创建并管理一组线程,避免了频繁创建销毁线程的开销,是构建高性能服务器的常见工程实践。结合HTTP协议解析与静态文件服务,开发者可以深入理解Web服务器的工作流程。本文以C语言为例,通过手写一个名为TinyHTTP的多线程服务器

weixin_30684743的博客 330

5.1 创建和销毁线程

同时也可以设置线程的调度优先级。下面的例子展示了如何在Linux中获取和设置有关线程数限制的信息,首先我们获取了当前默认的设置,然后将进程的最大数量(包含线程)设为最大值,最后我们验证了修改生效。如果在main()中没有显式调用pthread_exit(),可能会出现主线程比它创建的线程更早结束的情况,此时所有的线程都会被强制结束,从而产生一些超出预期的情况。在pthread_exit()方法中编程人员可以传入一个可选的有关终止状态的参数,这个参数会传递给连接了被终止线程的其他线程(后续章节内容中阐述)。

On my way 447

从零实现C语言Web服务器:深入解析Socket、HTTP与Linux网络编程

网络编程是构建互联网应用的基石,其核心在于理解数据如何在网络中传输与处理。其基本原理基于客户端-服务器模型,通过TCP/IP协议栈实现可靠通信。Socket编程接口提供了网络通信的抽象,开发者通过创建、绑定、监听和接受连接等系统调用建立通信链路。HTTP协议作为应用层协议,定义了Web通信的请求-响应格式,其解析与构建是Web服务器的核心功能。从技术价值看,掌握底层网络编程能极大提升对高并发、高性能系统的设计与优化能力,尤其在需要极致性能的中间件、网关和分布式系统中至关重要。应用场景广泛,从嵌入式设备到大型

weixin_30536513的博客 414

pthread 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach

pthead 创建与销毁详解 pthread_create pthread_join pthread_exit pthread_detach

luohaha66的博客 1262

C语言如何正确的终止正在运行的子线程

主要介绍了C语言如何正确的终止正在运行的子线程,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

保姆级避坑指南:用IWR6843ISK毫米波雷达实现区域检测,从软件安装到可视化调试全流程

本文提供IWR6843ISK毫米波雷达区域检测的全流程实战指南,涵盖环境搭建、固件烧录、可视化工具配置及性能优化等关键步骤。重点解决软件版本兼容性、烧录失败等常见问题,帮助开发者高效实现精准区域检测,避免开发过程中的常见陷阱。

weixin_42653691的博客 375

线程的创建与销毁

创建启动线程,销毁和终止线程

weixin_46078387的博客 1228

用Pixhawk 2.4.8和PX4 1.13,从零搭建你的第一支无人机编队(附避坑清单)

本文详细介绍了如何使用Pixhawk 2.4.8飞控和PX4 1.13固件从零搭建低成本无人机编队系统。涵盖硬件选型、固件配置、多机通信和编队飞行逻辑开发的全流程,特别针对学生和爱好者提供实战验证的避坑方案,帮助实现多机协同飞行。

weixin_27219587的博客 402

c语言自动销毁,C语言实现支持动态拓展和销毁的线程池

本文实例介绍了C 语言实现线程池,支持动态拓展和销毁,分享给大家供大家参考,具体内容如下实现功能1.初始化指定个数的线程2.使用链表来管理任务队列3.支持拓展动态线程4.如果闲置线程过多,动态销毁部分线程#include #include #include #include /*线程的任务队列由,函数和参数组成,任务由链表来进行管理*/typedef struct thread_worker_s{...

weixin_31622725的博客 646

计算pi小数点后10000位

数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,...

我的技术人生 7394

详解最大似然估计(MLE)、最大后验概率估计(MAP),以及贝叶斯公式的理解

声明:本文为原创文章,发表于nebulaf91的csdn博客。欢迎转载,但请务必保留本信息,注明文章出处。 本文作者: nebulaf91 本文原始地址:最大似然估计(Maximum likelihood estimation, 简称MLE)和最大后验概率估计(Maximum a posteriori estimation, 简称MAP)是很常用的两种参数估计方法,如果不理解这两种方法的思路,很

nebulaf91的博客 33万+

C语言多线程基础-01-线程的创建与销毁

一.线程创建首先要关联头文件Window.h,需要使用Windows系统的底层方法1.1 线程创建演示://定义一个方法,弹出一个消息框 //该方法返回值为DWORD WINAPI类型,参数为一个空指针 DWORD WINAPI run(void * p) { MessageBox(0, "多线程测试", "信息", 0); }//main方法中开启线程 int main(void) {

CycloneKid的博客 1万+

阿里云人工智能工程师ACA认证免费课程学习笔记

阿里云人工智能工程师ACA认证免费课程学习笔记

engchina的专栏 2013

c语言 封装跨平台线程头文件

本文介绍了一个跨平台C语言线程封装方案,通过单一头文件实现Windows(win32 API)和其他平台(pthread)的线程操作统一接口。核心思路是利用宏定义屏蔽平台差异,提供线程创建(thread_create)、等待(thread_join)、分离(thread_detach)等通用函数。示例代码展示了线程创建与等待返回值、线程分离两种典型用法。该方案无需额外编译配置,仅需包含头文件即可实现跨平台多线程开发,简化了项目移植和维护工作。通过统一的参数和返回值类型设计,有效解决了不同平台线程实现的兼容性

codeofcc的博客 1161

用友U8 API 二次开发:WebService封装7个核心DLL引用与U8Login登录避坑

本文详细介绍了用友U8 API二次开发中的WebService封装与U8Login登录优化实践。通过7个核心DLL的正确引用、U8Login登录机制的深度解析及IIS环境下的特殊处理方案,为开发者提供了一套高可用性的通用解决方案,助力企业实现ERP系统的高效集成与数字化转型。

weixin_42524171的博客 505

基于Simulink的电力电子负载特性模拟仿真实例

电阻性负载是最简单的负载形式,其阻抗为纯电阻,电流和电压之间的关系符合欧姆定律。电阻性负载的特点是消耗能量,不会存储能量。本示例将以一个典型的直流电源供电系统为例,展示如何利用Simulink进行不同负载特性的仿真模拟。直流电源:提供固定电压输入。逆变器(可选):根据需要产生PWM调制信号,驱动负载。负载模块:模拟不同类型的负载特性,如电阻性负载、电感性负载和容性负载。测量模块:用于观察负载上的电压和电流波形。系统架构视图plaintext深色版本v| || |

xiaoheshang_123的博客 429

C 语言中如何处理多线程?

在 C 语言中处理多线程可以使用操作系统提供的线程库或相关的 API。不同的操作系统提供了不同的多线程实现方式,下面将分别介绍在 Windows 和 Linux 系统下 C 语言处理多线程的方法,并给出相应的示例代码。线程函数是线程执行的具体逻辑,其返回值为类型,参数为LPVOID类型。// 线程执行的具体代码return 0;线程函数的返回值为void *类型,参数为void *类型。// 线程执行的具体代码\n");

2401_86074221的博客 887

2、稳定性问题全景图——死机、重启、ANR、Crash、黑屏五大类

当 Crash 发生在 system_server、surfaceflinger、mediaserver 等关键系统进程中时,其后果等同于系统级故障,可能触发 Zygote 重启甚至 kernel panic。这类问题在稳定性治理中的优先级应等同于 P0。

woailuojp的博客 49

linux下c语言多线程程序,linux下线程概念及用C语言实现示例

1、线程的状态线程有5种状态:初始化、可运行、运行中、阻塞、销毁。①初始化:创建一个线程。②可运行:执行完创建工作,线程变进入“可运行”的状态,即等待CPU时间碎片(执行权)。③运行中:得到CPU执行权后,程序变为“运行中”的状态,此时可以转变为“可运行”的状态(一个时间碎片执行完后),或者“阻塞”的状态(等待网络或者磁盘处理)。④阻塞:当发生I/O时,就进入了“阻塞”状态。⑤销毁:线程生命周期结...

weixin_35537968的博客 523

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

c语言跨平台线程封装

做跨平台开发的时候有时需要使用到线程库,但是不同平台的线程库是不一样的,在Windows上是使用系统win32 api创建和管理线程,Linux和Mac通常使用pthread,尽管Windows也可以使用第三方的pthread库,但这样库的依赖会比较多,项目的部署会麻烦些,最佳的方法应该还是写跨平台代码,通过宏区分不同平台的代码。 接口设计: 比较常用的线程相关的功能通常有: 1、线程对象 typedef void* acf_thread; 用这种方式定义线程对象是为了隐藏内部实现,减少头文件的

codeofcc的博客 834

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

Linux C/C++ 之 线程池

linux 线程池

m0_73588724的博客 811

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

windows与linux多线程对比

一.创建线程 1>windows HANDLE aThread[MAX_THREAD];  函数原型: HANDLE WINAPI CreateThread( _In_opt_ LPSECURITY_ATTRIBUTES lpThreadAttributes, _In_ SIZE_T ...

weixin_30865427的博客 306

多线程 windows linux,windows多线程编程_c语言 windows 多线程_linux多线程编程实例(2)...

利用SetHandleinformation方法可以随时修改内核对象句柄的一些属性,目前公开的句柄属性有两种,一种是该句柄是否能被继承,另一种是该句柄是否能被关闭。1 .5.2同名共享同名共享,不需要共享进程之间存在父子关系。但局限于内核对象是否支持这种共享方式。创建内核对象的Create函数中是否包含pszName是该内核对象是否支持同名共享的标志。l 方法一:当Process1通过Create...

weixin_35298139的博客 96

C语言程序内存布局

一、几个概念 1.栈(stack)       C语言通过栈来维护函数调用上下文,也就是说C中的函数、函数参数列表、局部变量、函数返回值都保存在栈内存中,在完成函数调用之后栈帧随即销毁,至于具体的压栈顺序和上下文维护工作由谁来完成,则取决于函数的调用方式(cdecl/stdcall/fastcall/pascal).       栈帧一般包括如下几方面内容:       ①函数的参数列表和

super_bert的专栏 4874

C++面试 -操作系统-代码能力:线程、进程的概念、创建与调度

在操作系统的上下文中,理解线程和进程的概念、创建和调度机制是非常重要的。这些概念不仅是计算机科学的基础知识,也是面试中常见的问题。下面是关于线程、进程的概念、创建与调度的详细介绍。

Bobowen的博客 1041

C语言中的多线程编程:POSIX线程库(Pthreads)入门与实战(一)

随着计算机硬件技术的飞速发展,多核处理器已经成为现代计算设备的标准配置。这种架构变革使得单个处理器芯片能够容纳多个执行核心,从而显著提升了并行计算能力。

weixin_56154577的博客 1692
上一篇: AIX 如何扩增逻辑卷和文件系统大小
下一篇: C语言 Socket基础接口(Windows & Linux)
Long_Freedom
博客等级 码龄11年 9粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值