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;
}
}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. MySQL5.7不停业务将传统复制变更为GTID复制
  2. C语言计算任意数的任意次方
  3. 开发者必知的8款App快速开发工具
  4. webstorm 10 设置文件的默认编码
  5. stringbuffer与stringbuilder的区别?
  6. 基础面试题——Javascript
  7. ORA-12011+ORA-06512–job执行失败问题
  8. BZOJ 1002 轮状病毒
  9. 【转】 LESS CSS 框架简介
  10. 自己动手写把”锁”之---JMM和volatile
  11. Linux第九讲随笔 -进程管理 、ps aux 、
  12. [小程序] 微信小程序 picker 中range-key中必须带单引号
  13. ZYNQ DMA驱动及测试分析
  14. 008-我的博友不锈钢钥匙扣上的随身金属外壳可启动U盘-20190413
  15. centos7配置lamp成功安装过
  16. 尝试利用slmail的漏洞来getshell
  17. 一个轻巧高效的多线程c++stream风格异步日志(一)
  18. Nginx 在ubuntu14.04下的安装
  19. 为什么需要API网关?
  20. struts2 参数注入 方法拦截器

热门文章

  1. Jmeter扩展组件开发(2) - 扩展开发第一个demo的实现
  2. Android Kotlin协程入门
  3. 鸿蒙内核源码分析(内存主奴篇) | 皇上和奴才如何相处 | 百篇博客分析OpenHarmony源码 | v10.04
  4. openlayer 4326与3857坐标互转之Java版
  5. Sentry 监控 - Snuba 数据中台架构简介(Kafka+Clickhouse)
  6. 10.11 HTTPS
  7. Win10连WiFi显示无internet,安全 却可以正常上网
  8. windows下编译caffe出现错误 C4996: &#39;std::_Copy_impl&#39;: Function call with parameters that may be unsafe?
  9. 关于C、Java、Python程序运行耗时及内存用量
  10. props&amp;attrs provide inject