线程简介及其函数使用实例(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

相关文章

C语言中联合体union的使用

本文编辑整理自: http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=179471 一、前言 “联合体”(union)与“结构体”(struct)有一些相似之处。但两者有本质上的不同。在结构体中,各成员有各自的内存空间, 一个结构变量的总长度是各成员长度之和。而在“联合”中,各成员共享一段内存空间, 一个联合变量

轻量级在线服装3D定制引擎Myway简介

我写的面向web元宇宙轻量级系列引擎中的另外一个,在线3D定制引擎Myway 3D。 用于在线商品定制,比如个性化服装的定制、日常用品(如杯子)、家装(被套)等物品的在线定制。 特性列表: 可更换衣服款式,按需定制更换模型可实时更改材质颜色可实时添加文本,并可实时修改大小、颜色和角度,支持自定义字体可实时添加艺术图标,并可实时修改大小、颜色和角度,支持翻转、各种对齐可更改衣服图案,按需求定制

Tolua使用笔记(上)

目录   1.准备工作 2.运行例子 01.HelloWorld:在C#中,创建和销毁Lua虚拟机 和 简单调用。 02.ScriptsFromFile:在C#中,对一个lua文件的执行调用 03.CallLuaFunction:在C#中,对lua函数的操作 04.AccessingLuaVariables:在C#中,对lua变量的操作 05.LuaCoroutine:在Lua中,

Vim使用基础篇

本文内容大部分来自 vimtutor,自带的教程的总结。在终端输入vimtutor 即可进入教程。 先总结一下,然后再分别介绍正常模式,插入模式,和可视模式三种模式下的命令。 目录 看完以后的汇总 1.正常模式(Normal模式) 1.移动光标 2.删除 3.【:】输入符 4.撤销 5.替换 6.重复命令【. ; ,】 7.复制粘贴 8.缩进 2.插入模式 INSERT

swiper实例

大家好,我是燐子,今天给大家带来swiper实例   微信小程序中的 swiper 组件是一种用于创建滑动视图的容器组件,常用于实现图片轮播、广告展示等效果。它通过一系列的子组件 swiper-item 来定义滑动视图的每一个页面。 基本用法   以下是一个简单的 swiper 示例代码:   WXML(页面结构) <swiper autoplay="true" interval="3

Java面试题:通过实例说明内连接、左外连接和右外连接的区别

在 SQL 中,连接(JOIN)用于在多个表之间组合行。最常用的连接类型是内连接(INNER JOIN)、左外连接(LEFT OUTER JOIN)和右外连接(RIGHT OUTER JOIN)。它们的主要区别在于它们如何处理表之间的匹配和不匹配行。下面是每种连接的详细说明和示例。 表示例 假设有两个表:Customers 和 Orders。 Customers CustomerIDCus

Lipowerline5.0 雷达电力应用软件下载使用

1.配网数据处理分析 针对配网线路点云数据,优化了分类算法,支持杆塔、导线、交跨线、建筑物、地面点和其他线路的自动分类;一键生成危险点报告和交跨报告;还能生成点云数据采集航线和自主巡检航线。 获取软件安装包联系邮箱:2895356150@qq.com,资源源于网络,本介绍用于学习使用,如有侵权请您联系删除! 2.新增快速版,简洁易上手 支持快速版和专业版切换使用,快速版界面简洁,保留主

如何免费的去使用connectedpapers?

免费使用connectedpapers 1. 打开谷歌浏览器2. 按住ctrl+shift+N,进入无痕模式3. 不需要登录(也就是访客模式)4. 两次用完,关闭无痕模式(继续重复步骤 2 - 4) 1. 打开谷歌浏览器 2. 按住ctrl+shift+N,进入无痕模式 输入网址:https://www.connectedpapers.com/ 3. 不需要登录(也就是

【操作系统】信号Signal超详解|捕捉函数

🔥博客主页: 我要成为C++领域大神🎥系列专栏:【C++核心编程】 【计算机网络】 【Linux编程】 【操作系统】 ❤️感谢大家点赞👍收藏⭐评论✍️ 本博客致力于知识分享,与更多的人进行学习交流 ​ 如何触发信号 信号是Linux下的经典技术,一般操作系统利用信号杀死违规进程,典型进程干预手段,信号除了杀死进程外也可以挂起进程 kill -l 查看系统支持的信号

【服务器运维】CentOS7 minimal 离线安装 gcc perl vmware-tools

0. 本机在有网的情况下,下载CentOS镜像 https://www.centos.org/download/ 1. 取出rpm 有的情况可能不需要net-tools,但是如果出现跟ifconfig相关的错误,就把它安装上。另外如果不想升级内核版本的话,就找对应内核版本的rpm版本安装 perl-Time-Local-1.2300-2.el7.noarch.rpmperl-Tim