Linux中多线程详解及简单实例
作者:Sweet_wen 发布时间:2022-02-06 21:53:46
标签:Linux,多线程
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!
来源:http://blog.csdn.net/Sweet_wen/article/details/70859545
0
投稿
猜你喜欢
- 中纪委监察部开通举报网站后广受关注,昨日下午网站登陆一直不顺畅,热线电话也一直忙音;到了晚上,相关服务才恢复正常,网民估计是太多人登陆所致。
- 当全世界大多数行业面临危机和困境的时候,Google的利润和市值依然迅速增长,Google暴利的背后到底隐藏了什么秘密。本文将第一次在世界上
- VPS根据 * 的定义就是virtual private server ,比虚拟主机高级,比专用服务器低档的一种中间形式。一般要用VPS,
- Godaddy主机用户怎样设置Linux主机的高级目录权限呢?请按如下操作:首先、 登陆你的Account Manager.第二、 在My
- 北京时间7月2日消息,据国外媒体报道,博客服务提供商Wordpress(Wordpress.com)日前推出了拨打电话发布语音博客的新功能“
- linux系统下,我们可以修改或者添加.htaccess 文件来实现discuz的伪静态。1. 文章中引用的部分,则是实现伪静态的方法!我们
- 20岁的黑龙江无业人员段宗屹,通过发送 “灰鸽子”木马病毒,获取淘宝网店铺店主的银行信息,先后3次盗取店主账户内两万余元资金。近日,宣武法院
- 1.脚本vim环境在脚本中通常要显示一些脚本信息,这些信息可以通过对vim设定使其自动出现/etc/vimrc 此文件是vim的主配置文件,
- .NET SDK 下载链接https://dotnet.microsoft.com/download/dotnet/6.0安装脚本https
- PHPWind v7.3.2收藏夹分页链接错误问题解决方法:打开mode/o/m_article.php查找:$pages =&n
- WebP(发音:weppy)是一种同时提供了有损压缩与无损压缩(可逆压缩)的图片文件格式,派生自影像编码格式VP8,被认为是WebM多媒体格
- 【搜狐IT消息】(文/雷风)6月25日,原微软中国总裁、盛大网络总裁唐骏在接受搜狐IT采访时对比尔·盖茨进行了评价,并回顾了与盖茨交往中难忘
- Google是我最喜欢的搜索引擎,我被Google的精神而折服,被Google的文化而感染,我可以说是Google的超级粉丝之一了,今天看了
- 随着电子商务的发展,越来越多的中小企业已经认识到了网络对于企业的重要性,而网站是迈向网络的第一步。中小企业网站犹如雨后春笋一般纷纷冒起。在全
- (本文以Windows主机为例进行讲解)首先登录Godaddy,方法参考:Godaddy账户登录及基本功能图解登录以后在我的产品中点击主机账
- 内裤说,第一次拿Google AdSense Dollar,要记一下,那我就记一下。终于拿到了传说中的Google AdSense
- 二、MDaemon设置MDaemon的管理界面很专业,它所提供的选择和设置项目非常多,但是实际上真正需要设置的选项并不是很多。(1)双击任务
- 11月18日消息,“互联网经历了十几年的发展,已经衍生出了大量形色不同的病毒,然而传统的收费杀毒厂商的杀毒引擎近十年来几
- 下面给大家介绍centos6.5 ssh配置与使用教程的知识,具体详情如下所示:#rpm -qa |grep ssh 检查是否装了SSH包#
- 从2009年到2011年,接触Dedecms已经有2个年头了,在这期间使用DEDE制作了有10来个网站,有些网站也取得不错的搜索排名和流量,