线程简介及其函数使用实例(gcc *.c -lpthread)

2024-06-20 20:44

本文主要是介绍线程简介及其函数使用实例(gcc *.c -lpthread),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.概念

线程(LWP(Light Weight process))

          线程是轻量级的进程,(是比进程粒度更小的执行单元)进程是分配资源的最小单位(0-3G)(PS:一辆马车8匹马 进程 其中的一个马是线程),线程是调度(PS:或执行)的最小单位。线程本身不占用资源它是共享进程的资源(PS:一个进程中的许多线程 共享一个进程的0-3G空间)。线程没有进程安全,(PS:考虑安全 选择多进程,考虑并发性 选多线程因为如果一个线程导致进程结束,其他所有的线程都不能执行。多线程的并发性比多进程的高,因为线程间切换比进程间切换时间短。线程间资源共享(PS:一个进程的全局变量 其中的线程能全部共享),所以线程间通信要比进程间通信更为容易。

ps -ajx ==>看进程附加态(状态带(小L)l,代表多线程)
ps -eLf ==>多线程
htop ==>多线程

2.线程接口提供方式

多线程创建的接口是第三方库提供的libpthread.so,在编译的时候就必须链接这个库gcc xxx.c -lpthread,man手册需要使用apt-get来安装(sudo apt-get install manpages-*)。

3.线程创建使用到的函数

#include <pthread.h>int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);
功能:创建一个线程
参数:@thread:线程号@attr:线程属性,使用默认值NULL (PS线程属性:https://docs.oracle.com/cd/E19253-01/819-7051/6n919hpaa/index.html)@start_routine:线程处理函数(线程体)@arg:给线程处理函数传参(PS:多参数 可用结构体传参)
返回值:成功返回0,失败返回错误码
Compile and link with -lpthread.
(PS:编译的时候 要链接这个库,gcc xxx.c -lpthread)

4.多线程创建实例 (gcc 01thread.c -lpthread编译)

01thread.c

#include <head.h>
void * thread(void *arg){printf("子线程...\n");
}
int main(int argc,const char * argv[])
{pthread_t tid;if((errno=(pthread_create(&tid,NULL,thread,NULL))!=0)){perror("pthread_create error");exit(-1); //pthread_create函数成功返回0}printf("主线程...\n");sleep(1);//不能让进程退出 线程退出了 线程就没有执行的内存了return 0;
}

5.多线程创建实例 (gcc 02thread.c -lpthread编译)

02thread.c

#include <head.h>
void *thread(void *arg)
{int a = *(int *)arg;printf("a = %d\n", a);printf("子线程...\n");
}
int main(int argc, const char *argv[])
{pthread_t tid;int num = 100;if ((errno = (pthread_create(&tid, NULL, thread, (void *)&num)) != 0)){perror("pthread_create error");exit(-1); // pthread_create函数成功返回0}printf("主线程...\n");sleep(1); // 不能让进程退出 线程退出了 线程就没有执行的内存了return 0;
}

6.多线程执行顺序问题

多线程执行没有先后顺序、时间片轮询,上下文切换

7.多线程占用内存问题

多线程可以共享全局变量,每个线程都可以对此全局变量进行读写操作(全局变量可以被多线程贡共享)

#include <head.h>
int B = 10;
void *thread1(void *arg)
{printf("子线程1...\n");while (1){B++;sleep(1);}
}
void *thread2(void *arg)
{printf("子线程2...\n");while (1){printf("B= %d\n", B);sleep(1);}
}
int main(int argc, const char *argv[])
{pthread_t tid1, tid2;if ((errno = (pthread_create(&tid1, NULL, thread1, NULL)) != 0)){perror("pthread_create error");exit(-1); // pthread_create函数成功返回0}if ((errno = (pthread_create(&tid2, NULL, thread2, NULL)) != 0)){perror("pthread_create error");exit(-1); // pthread_create函数成功返回0}printf("主线程...\n");while (1){}// 不能让进程退出 线程退出了 线程就没有执行的内存了return 0;
}

这篇关于线程简介及其函数使用实例(gcc *.c -lpthread)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1079204

相关文章

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome