Q1:多线程与多进程相比有什么优势?

  • 多进程程序耗费的资源大,因为fork()的时候子进程需要继承父进程的几乎所有东西,但是多线程程序线程只继承一部分,即自己的私有数据,例如自己的线程ID,一组寄存器,堆栈,信号屏蔽字,errno值,调度优先级

  • 多进程的程序之间的数据相互独立,所以通信之间就必须要专门的通信方式,但是多线程之间共享数据空间,所以线程之间通信变的方便。

  • 多进程之间被分配不同的内存空间,所以进程之间的切换就相对比较慢,但是多线程之间共享主线程的地址和内存空间,所以线程之间的切换就十分迅速。

  • 多线程程序使得要处理多个命令的程序结构变得简单,每个线程可以只让它执行一条命令。

Q2:编写一个多线程程序,要求主线程创建3个子线程,3个子线程同时修改它们共享的一个全局变量,看看有什么结果?

当然会产生一些意想不到的结果,不能正确的修改,只研究这个问题是没什么意义的,解决线程间资源不同步的问题—-互斥锁
代码如下:互斥锁的用法

Q3:如何在多线程程序中实现线程的同步,有哪些方式?

我知道两种方式:互斥锁和条件变量
互斥锁:它可以解决多线程之间访问同一变量时的不同步问题,即可以保证在某一事件在一个时刻只可能被一个线程访问。
条件变量:它可以解决对于一个全局变量(可以是一段代码——临界区,也可以是一个资源——某个文件)多线程同时访问时的不同步问题。也是保证某个资源只能在一个时间被一个线程访问。它一般和互斥锁配合使用,使用时如果没有抢到锁,就会阻塞在锁的位置。一旦抢到锁,就进入wait状态,这时会将锁释放,然后等待signal或者broadcast激活后,又会重新加锁。
互斥锁代码上面有,条件变量代码如下:互斥锁的用法

Q4:写出创建线程私有数据的步骤。

创建线程的私有数据,即一键多值技术,步骤如下:
1:申请一个”key”; pthread_key_t key;
2:创建这个”key”;pthread_key_create(&key,NULL);
3:将这个”key”与线程内部的”全局变量”相关联。pthread_setspecific(key,globvar);
4:得到与该函数相关的”key”值:pthread_key_getspecific(key);
5:销毁一个”key”:pthread_key_delete(key);
代码如下:TSD——一键多值技术

Q5:编写一个多进程多线程的程序,要求创建4个子进程,每个子进程创建两个线程,进程和线程的功能不做要求,可以只打印一句话。代码如下:

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<stdlib.h>
void *func1()
{
printf("i am a thread,threadId:%u\n",pthread_self());
}
int main(int argc,char *argv[])
{
int pid1,pid2,pid3;
pthread_t tid1,tid2,tid3,tid4,tid5,tid6,tid7,tid8;
pid1 = fork();
switch(pid1)
{
case 0:
pid2 = fork();
switch(pid2)
{
case 0:
printf("i am a process ,pid:%d\n",getpid());
pthread_create(&tid1,NULL,func1,NULL);
pthread_create(&tid2,NULL,func1,NULL);
break;
default:
printf("i am a process ,pid:%d\n",getpid());
pthread_create(&tid3,NULL,func1,NULL);
pthread_create(&tid4,NULL,func1,NULL);
// exit(0);
break;
}
default:
pid3 = fork();
switch(pid3)
{
case 0:
printf("i am a process ,pid:%d\n",getpid());
pthread_create(&tid5,NULL,func1,NULL);
pthread_create(&tid6,NULL,func1,NULL);
break;
default:
printf("i am a process ,pid:%d\n",getpid());
pthread_create(&tid7,NULL,func1,NULL);
pthread_create(&tid8,NULL,func1,NULL);
// exit(0);
break;
}
}
}

Linux&C 线程控制 课后习题的更多相关文章

  1. Linux&C 线程控制 课后习题

    Q1:多线程与多进程相比有什么优势? 多进程程序耗费的资源大,因为fork()的时候子进程需要继承父进程的几乎所有东西,但是多线程程序线程只继承一部分,即自己的私有数据,例如自己的线程ID,一组寄存器 ...

  2. linux&c 进程控制 课后习题

    (声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...

  3. linux&c 进程控制 课后习题

    (声明:本篇博客只是博主自己的理解,加以整理,目的是总结刚学过的进程知识,不一定绝对正确,非常愿意听客官您提出宝贵意见.) Q1:进程中的全局数据段(全局变量),局部数据段(局部变量),静态数据段的分 ...

  4. Linux学习--线程控制

    关于线程控制,主要就是几个模块,我们一个一个消灭.消化: 一.线程创建: 1.先来看看在Linux环境下的线程创建函数: 分析:意思很明显: 1.函数名是 pthread_create  : 2.功能 ...

  5. linux线程控制&线程分离

    线程概念 线程,有时被称为轻量级进程(Lightweight Process,LWP),是程序执行流的最小单元. 线程是程序中一个单一的顺序控制流程.进程内一个相对独立的.可调度的执行单元,是系统独立 ...

  6. 《Python核心编程》 第六章 序列 - 课后习题

    课后习题 6–1.字符串.string 模块中是否有一种字符串方法或者函数可以帮我鉴定一下一个字符串是否是另一个大字符串的一部分? 答:成员关系操作符(in.not in) import string ...

  7. 线程&线程控制

    线程基本概念: 1 线程 (1)概念:linux下没有真正的线程,所谓的线程都是通过进程的pcb模拟的,因此linux下的线程也称为“轻量级进程”,之前我们所说的进程现在看来,可以理解为:只有一个线程 ...

  8. OpenCV学习笔记之课后习题练习2-5

    5.对练习4中的代码进行修改,参考例2-3,给程序加入滚动条,使得用户可以动态调节缩放比例,缩放比例的取值为2-8之间.可以跳过写入磁盘操作,但是必须将变换结果显示在窗口中. 参考博文:blog.cs ...

  9. OpenCV学习笔记之课后习题练习3-3

    3.3 创建一个100*100的拥有三个通道的二维字节类型矩阵,将其元素全部置0.通过cvPtr2D函数将指针指向中间通道(绿色),以(20,5)和(40,20)为顶点间画一个绿色的长方形. cvPt ...

随机推荐

  1. 华为云计算IE面试笔记-FusionCompute上的虚拟机A和虚拟机B不能正常通信,请描述可能的故障点和排除方法(分析虚拟机A和虚拟机B不通)

    *快速定位故障点:(考到) ARP:同一二层内可以通过ARP -a命令查询到要访问的主机IP(ARP表项中记录了同一二层中的IP和MAC的对应关系),若查询不到,说明二层出现问题(Vlan 间不通)或 ...

  2. 朴素贝叶斯原理、实例与Python实现

    初步理解一下:对于一组输入,根据这个输入,输出有多种可能性,需要计算每一种输出的可能性,以可能性最大的那个输出作为这个输入对应的输出. 那么,如何来解决这个问题呢? 贝叶斯给出了另一个思路.根据历史记 ...

  3. Css预编译(Sass&&Less)

    目录 Less与Sass是css的预处理技术 而CoffeeScript.TypeScript则是javascript的预处理技术. Less与Sass是css的预处理技术 而CoffeeScript ...

  4. heoi2020树

    _ _01trie树合并 _ _ 在考场上一直想用数据结构维护,还花了好长时间算 $(a+1)^(b+1)$,现在看来当时好像在犯傻........ 异或有个神奇的工具是 01trie 树,此题就用此 ...

  5. Superior Scheduler:带你了解FusionInsight MRS的超级调度器

    摘要:Superior Scheduler是一个专门为Hadoop YARN分布式资源管理系统设计的调度引擎,是针对企业客户融合资源池,多租户的业务诉求而设计的高性能企业级调度器. 本文分享自华为云社 ...

  6. Sentry 监控 - Snuba 数据中台架构(Data Model 简介)

    系列 1 分钟快速使用 Docker 上手最新版 Sentry-CLI - 创建版本 快速使用 Docker 上手 Sentry-CLI - 30 秒上手 Source Maps Sentry For ...

  7. mysql数据备份及恢复详细操作

    一.数据库数据备份 1.全备 BakDir=/backup/full #创建全备目录 LogFile=/backup/full/bak.log #创建备份日志 Date=`date +%Y%m%d` ...

  8. 干货 | 数据为王,携程国际火车票的 ShardingSphere 之路

    以下文章来源于携程技术 ,作者瑞华 作者简介 瑞华,携程高级后端开发工程师,关注系统架构.分库分表.微服务.高可用等. 一.前言 随着国际火车票业务的高速发展,订单量快速增长,单数据库瓶颈层面的问题逐 ...

  9. Java基础之(八):顺序结构与选择结构

    顺序结构 Java的基本结构就是顺序结构 顺序结构是最简单的算法结构 它是任何一个算法都离不开的一种基本算法结构. 例子: public static void main(String[] args) ...

  10. 全网详细JAVA知识点干货学习路线目录,值得收藏学习!

    1.Java简介及开发环境配置 2.Java中的注释&关键字&常量&变量&标识符 3.Java中的基本数据类型及其类型转换 4.Java中的运算符及表达式 5.Java ...