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


猜你喜欢
- 首先,解释下什么是资源的永久重定向,通俗简单理解下,当你在浏览器中输入sina.com.cn(新浪首页)的时候,网址是不是变成 www.si
- 前言最近在服务器上搭建了一套Redis3.0伪分布式集群,发现一个问题,就是Shell脚本编写能力和运维工具的重要性亟待提高。集群环境安装1
- 1.修改防火墙配置文件# vi /etc/sysconfig/iptableswq保存退出,重启防火墙service iptables re
- SEO之所以难学,经笔者分析最大的原因是大家把SEO太复杂化了,禅说:“简单就好”。现在各类有关SE
- 近日,康盛创想BBS与SNS社区产品双剑合璧,推出了Discuz! 7.0和UCenter Home (简称UCHome)1.5。这两款社区
- 搜索引擎优化项目的规划需要做什么?系统的分析,哪种SEO策略适合当前客户的网站。长尾关键词的方向、内容的方向、竞争的程度以及如何增加独特的网
- 服务器安全设置1、系统盘和站点放置盘必须设置为NTFS格式,方便设置权限。2、系统盘和站点放置盘除administrators 和syste
- 当一个网站定位为地方 * 站点时,就需要对注册用户所在地域有一个严格的界定。例如,一个本地婚介交友网站,经常来这里互动的用户都是有实际婚介交
- 最近,湖南SEO在子目录下面安装了一个discuz论坛程序。大家都知道zblog是asp,discuz是php,那么asp的zblog应该如
- 一则国外研究报告称,46.6%的Digg头版内容被50个网站控制。这些网站包括telegraph.co.uk、nytimes.com、you
- 经常听到读计算机专业学生,毕业之后发出感叹:“我在大学什么也没学到,现在计算机的东西都不会!”。就其原因来看,不外乎是其一,学生自身原因。有
- 1.域名和空间域名对排名的影响是非常小,但对网站整体来说却是很重要,因为一个好的域名会给我们带来很大流量和知名度,选择的时候,以短小易记为原
- 一、为何要DDoS?随着Internet互联网络带宽的增加和多种DDoS黑客工具的不断发布,DDoS拒绝服务攻击的实施越来越轻易,DDoS攻
- V5mall震撼出击 剑指C2C多用户商城经过半年多的深入研发和多次封闭内测,最受广大网商欢迎的电子商务系统提供商——v5shop在虎年伊始
- 对大多数系统管理员来说扩充 Linux 服务器的磁盘空间是日常的工作之一。因此这篇文章会通过使用 Linux 命令,在 CentOS 7 系
- 在自己的电脑上安装了一个 Linux ubuntu系统,第一次安装,记录下每一步步骤,以下是安装过程:第一步:下载ubuntu镜像文件&nb
- 网站内部优化作弊和不合理优化方式认定标准1,关键词堆砌为了增加关键词密度,在网页上大量重复关键词的行为,希望提高关键词密度,提高网页针对关键
- 在Discuz! 7.0中发布多媒体,比如引用其他网站的视频、mp3 等。需要设置三个地方。首先,对编辑器设置。打开后台,界面=>编辑
- 据有关资料显示,现在有大量的服务器仍在使用IIS提供Web服务,甚至有争夺占领Apache市场的趋势。在Web威胁日益严重的今天,我们当然要
- 目前很多企业单位正在构架自己的Intranet,FTP服务器是其中的一个服务支持,有很多单位购置了基于UNIX平台的计算机,为了在网上能够提