Linux中多线程详解及简单实例
发布时间 - 2026-01-11 02:31:24 点击率:次Linux中多线程详解及简单实例

1.概念
进程:运行中的程序。
线程:一个程序中的多个执行路径。更准确的定义是:线程是一个进程内部的一个控制序列。
2.为什么要有线程?
用fork调用进程代价太高,需要让一个进程同时做多件事情,线程就非常有用。
3.线程的优点和缺点。
优点:
(1)有时,让程序看起来是在同时做两件事是非常有用的。 比如在编辑文档时,还能统计文档里的单词个数。
(2)一个混杂着输入、计算、输出的程序,利用线程可以将这3个部 分分成3个线程来执行,从而改变程序执行的性能。
(3)一般来说,线程之间切换需要操作系统所做的工作比进程间切换需要的代价小。
缺点:
(1)编写线程需要非常仔细的设计。
(2)对多线程的调试困难程度比单线程调试大得多。
4.创建线程
#include <pthread.h> (1)int pthread_create(pthread_t *thread,pthread_attr_t *attr,void *(*start_routine)(void *),void *arg); pthread_t pthread_self(void); (2)int pthread_equal(pthread_t thread1,pthread_t thread2); (3)int pthread_once(pthread_once_t *once_control,void(*init_routine)(void));
Linux系统支持POSIX多线程接口,称为pthread。编写linux下的多线程程序,需要包含头文件pthread.h,链接时需要使用库libpthread.a。
如果在主线程里面创建线程,程序就会在创建线程的地方产生分支,变成两个部分执行。线程的创建通过函数pthread_create来完成。成功返回0。
1.线程创建: int pthread_create(pthread_t thread,pthread_attr_t *attr,void (start_routine)(void ),void *arg); pthread_t pthread_self(void); 参数说明: thread:指向pthread_create类型的指针,用于引用新创建的线程。 attr:用于设置线程的属性,一般不需要特殊的属性,所以可以简单地设置为NULL。 (start_routine)(void ):传递新线程所要执行的函数地址。 arg:新线程所要执行的函数的参数。 调用如果成功,则返回值是0,如果失败则返回错误代码。 2.线程终止 void pthread_exit(void *retval); 参数说明: retval:返回指针,指向线程向要返回的某个对象。 线程通过调用pthread_exit函数终止执行,并返回一个指向某对象的指针。注意:绝不能用它返回一个指向局部变量的指针,因为线程调用该函数后,这个局部变量就不存在了,这将引起严重的程序漏洞。 3.线程同步 int pthread_join(pthread_t th, void **thread_return); 参数说明: th:将要等待的线程,线程通过pthread_create返回的标识符来指定。 thread_return:一个指针,指向另一个指针,而后者指向线程的返回值。
一个简单的创建多线程的程序:
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void *thread_function(void *arg);
char message[] = "Hello World";
int main()
{
int res;
pthread_t a_thread;
void *thread_result;
res = pthread_create(&a_thread, NULL, thread_function, (void *)message);
if (res != 0)
{
perror("Thread creation failed!");
exit(EXIT_FAILURE);
}
printf("Waiting for thread to finish.../n");
res = pthread_join(a_thread, &thread_result);
if (res != 0)
{
perror("Thread join failed!/n");
exit(EXIT_FAILURE);
}
printf("Thread joined, it returned %s/n", (char *)thread_result);
printf("Message is now %s/n", message);
exit(EXIT_FAILURE);
}
void *thread_function(void *arg)
{
printf("thread_function is running. Argument was %s/n", (char *)arg);
sleep(3);
strcpy(message, "Bye!");
pthread_exit("Thank you for your CPU time!");
}
输出结果
$./thread1[输出]: thread_function is running. Argument was Hello World Waiting for thread to finish... Thread joined, it returned Thank you for your CPU time! Message is now Bye!
以上就是Linux 多线程的实例详解,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# Linux
# 多线程
# 多线程详解
# 多线程应用
# Linux多线程编程快速入门
# linux下c语言的多线程编程
# 详解Linux多线程编程(不限Linux)
# linux多线程编程(五)
# linux多线程编程(四)
# Linux下的多线程编程(三)
# Linux多线程编程(二)
# Linux多线程编程(一)
# linux多线程编程详解教程(线程通过信号量实现通信代码)
# Linux下的多线程编程实例解析
# 所要
# 返回值
# 是一个
# 文档
# 是在
# 多个
# 不需要
# 就不
# 如有
# 还能
# 要有
# 会在
# 希望能
# 得多
# 所做
# 谢谢大家
# 太高
# 设置为
# 件事
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
linux top下的 minerd 木马清除方法
EditPlus中的正则表达式实战(6)
如何获取PHP WAP自助建站系统源码?
网站建设整体流程解析,建站其实很容易!
如何用虚拟主机快速搭建网站?详细步骤解析
Laravel如何使用Facades(门面)及其工作原理_Laravel门面模式与底层机制
宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程
个人摄影网站制作流程,摄影爱好者都去什么网站?
什么是javascript作用域_全局和局部作用域有什么区别?
瓜子二手车官方网站在线入口 瓜子二手车网页版官网通道入口
Edge浏览器怎么启用睡眠标签页_节省电脑内存占用优化技巧
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
教学论文网站制作软件有哪些,写论文用什么软件
?
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
Laravel如何实现图片防盗链功能_Laravel中间件验证Referer来源请求【方案】
微信小程序制作网站有哪些,微信小程序需要做网站吗?
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
Zeus浏览器网页版官网入口 宙斯浏览器官网在线通道
如何用PHP快速搭建CMS系统?
Python图片处理进阶教程_Pillow滤镜与图像增强
Laravel如何实现本地化和多语言支持?(i18n教程)
Laravel如何实现RSS订阅源功能_Laravel动态生成网站XML格式订阅内容【教程】
Laravel与Inertia.js怎么结合_使用Laravel和Inertia构建现代单页应用
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
jQuery中的100个技巧汇总
如何在服务器上三步完成建站并提升流量?
小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?
原生JS获取元素集合的子元素宽度实例
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
专业商城网站制作公司有哪些,pi商城官网是哪个?
微信h5制作网站有哪些,免费微信H5页面制作工具?
DeepSeek是免费使用的吗 DeepSeek收费模式与Pro版本功能详解
谷歌浏览器下载文件时中断怎么办 Google Chrome下载管理修复
胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?
HTML5建模怎么导出为FBX格式_FBX格式兼容性及导出步骤【指南】
如何在阿里云购买域名并搭建网站?
🚀拖拽式CMS建站能否实现高效与个性化并存?
Laravel如何实现文件上传和存储?(本地与S3配置)
Laravel如何使用Contracts(契约)进行编程_Laravel契约接口与依赖反转
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
HTML透明颜色代码怎么让图片透明_给img元素加透明色的技巧【方法】
如何快速重置建站主机并恢复默认配置?
Laravel Artisan命令怎么自定义_创建自己的Laravel命令行工具完全指南
深圳网站制作平台,深圳市做网站好的公司有哪些?
太平洋网站制作公司,网络用语太平洋是什么意思?
Laravel Eloquent:优雅地将关联模型字段扁平化到主模型中
html5的keygen标签为什么废弃_替代方案说明【解答】
Laravel如何实现用户角色和权限系统_Laravel角色权限管理机制

