文档章节

Head First C 第十二章 线程 平行世界

AlexTuan
 AlexTuan
发布于 2016/04/27 20:29
字数 680
阅读 45
收藏 1

Head First C 第十二章 线程 平行世界

前面我们已经会用多进程的方式,来让计算机同时做多件事,但是进程还有以下几个缺点:

  1. 创建进程要花时间 有的机器创建进程只需要花一丁点时间,虽然时间很短,但有时候你想要执行的任务才十几毫秒,每次创建进程就很低效。
  2. 共享数据不方便 当创建子进程时,子进程会自动包含父进程数据的副本,但这只是副本,如果想进行数据交互,还需要通过管道或其它手段。
  3. 进程会让代码冗长混乱。

因此,我们需要:

使用线程

普通进程一次只做一件事。我们可以选择在一个进程中使用多个线程,所有线程能访问同一段堆存储器,读写同一个文件,使用同一个网络套接字进行通信。当一个线程修改了某个全局变量,其它线程马上就能看到。是不是非常amazing?

如何创建线程

线程库有很多,这里我们使用POSIX线程库,也叫pthread。

假设我们要在独立的线程中运行这两个函数:

void *does_not(void *a) {
  int i = 0;
  for (i = 0; i < 5; i++) {
    sleep(1);
    puts("Does not!");
  }
  return NULL;
}

void *does_too(void *a) {
  int i = 0;
  for (i = 0; i < 5; i++) {
    sleep(1);
    puts("Does too!");
  }
  return NULL;
}

线程函数的返回类型必须是void*

用pthread_create创建线程

在主函数中,我们要创建两个线程,每个线程都需要把信息保存在一个叫pthread_t的数据结构中,然后就可以用pthread_create()创建并运行线程。

  pthread_t t0;
  pthread_t t1;
  if (pthread_create(&t0, NULL, does_not, NULL) == -1)
    error("Can't create thread t0");
  if (pthread_create(&t1, NULL, does_too, NULL) == -1)
    error("Can't create thread t1");

pthread_create()函数定义:

pthread_create(pthread_t *restrict thread,
	const pthread_attr_t *restrict attr,
	void *(*start_routine)(void *),
	void *restrict arg);

接收4个参数,分别为:线程指针、属性、启动动作(一个返回值为void*,接收参数也为void*的函数指针)和启动动作的参数。

用pthread_join等待线程结束

  void *result;
  if (pthread_join(t0, &result) == -1)
    error("Can't join t0");
  if (pthread_join(t1, &result) == -1)
    error("Can't join t1");

result用来接收线程返回的结果,一旦两个线程结束,程序就可以退出了。

编译和运行

编译时使用如下命令:

gcc do_sth.c -lpthread -o do_sth

由于我们使用了pthread库,在链接时要加上。

试运行输出结果如下: do_sth_result 两个函数的输出结果是交替出现的,两个函数是在同时运行。

本节代码

thread sample

© 著作权归作者所有

AlexTuan
粉丝 4
博文 27
码字总数 17966
作品 0
程序员
私信 提问
《跟我学Shiro》系列教程PDF完结版下载

Shiro目录 第一章 Shiro简介 第二章 身份验证 第三章 授权 第四章 INI配置 第五章 编码/加密 第六章 Realm及相关对象 第七章 与Web集成 第八章 拦截器机制 第九章 JSP标签 第十章 会话管理 ...

HenrySun
2016/10/09
680
0
我们的宇宙是数学计算出来的?——《穿越平行宇宙》读书笔记

万维钢《精英日课》076讲开始讲《穿越平行宇宙-Our Mathematical Universe》这本书,脑洞开得好大呀,好不容易接受量子力学的随机性了,忽然发现又不随机了! 这本书从宏观尺度宇宙讲起,我们...

梅拉
2018/01/24
0
0
《HTML+CSS3权威指南》笔记摘要 - 目录

主要是想借助这个平台让大家给我学习途中的错误和不好的地方给与纠正。 我会努力最短时间内完成更新,如果发现有错别字或者Code错误,请指出。 信息:建议使用Opera10以上或者Google浏览器测...

产品哥
2011/12/02
416
1
13篇文章,教你学会ES6知识点

ES6 深入理解ES6》学习笔记 本文用于汇总链接到各个子章节的内容,github 欢迎大家题issues和PR,如果对你有帮助,也可以给 star 支持 :) 目录 第一章 块级绑定 第二章 字符串和正则表达式 ...

你听___
2018/05/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

skywalking(容器部署)

skywalking(容器部署) 标签(空格分隔): APM [toc] 1. Elasticsearch SkywalkingElasticsearch 5.X(部分功能报错、拓扑图不显示) Skywalking需要Elasticsearch 6.X docker network create......

JUKE
14分钟前
2
0
解决Unable to find a single main class from the following candidates [xxx,xxx]

一、问题描述 1.1 开发环境配置 pom.xml <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><!--一定要对上springboot版本号,因......

TeddyIH
14分钟前
2
0
Dubbo服务限制大数据传输抛Data length too large: 13055248, max payload: 8388608解决方案

当dubbo服务提供者向消费层传输大数据容量数据时,会受到Dubbo的限制,报类似如下异常: 2019-08-23 11:04:31.711 [ DubboServerHandler-XX.XX.XX.XXX:20880-thread-87] - [ ERROR ] [com.al...

huangkejie
18分钟前
3
0
HashMap和ConcurrentHashMap的区别

为了线程安全,ConcurrentHashMap 引入了一个 “分段锁” 的概念。具体可以理解把一个大的 map 拆分成 N 个小的 Map 。最后再根据 key.hashcode( )来决定放到哪一个 hashmap 中去。 hashmap ...

Garphy
18分钟前
1
0
购买SSL证书需要注意哪些问题

为了保障网站的基本安全,为网站部署SSL证书,已经是一种常态了。各大浏览器对于安装了SSL证书的网站会更友好,并且不会发出“不安全”的提示。部署SSL证书之前首先得去给网站购买一个SSL证书...

安信证书
48分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部