什么是线程问题?


我们可以讨论在设计多线程程序时需要考虑的一些问题。这些问题如下:

fork() 和 exec() 系统调用

fork() 用于创建副本进程。fork() 和 exec() 系统调用的含义在多线程程序中发生了变化。

如果程序中的一个线程调用了 fork(),新进程是否会复制所有线程,或者新进程是单线程的?例如,一些 UNIX 系统选择使用两种版本的 fork(),一种复制所有线程,另一种只复制调用 fork() 系统调用的线程。

如果线程调用 exec() 系统调用,则 exec() 参数中指定的程序将替换整个进程,包括所有线程。

信号处理

通常,信号用于 UNIX 系统中通知进程已发生特定事件。接收到的信号可以是同步的或异步的,具体取决于事件的来源和原因。

所有信号,无论是同步的还是异步的,都遵循以下相同模式:

  • 特定事件的发生会生成信号。

  • 信号传递给进程。

  • 一旦传递,必须处理信号。

取消

线程取消是在线程完成之前终止线程的任务。

**例如**:如果多个数据库线程并发地搜索数据库,并且一个线程返回结果,则其余线程可能会被取消。

目标线程是要取消的线程,目标线程的取消可能发生在两种不同的场景中:

  • **异步取消**:一个线程立即终止目标线程。

  • **延迟取消**:目标线程定期检查是否应终止,从而使其有机会以普通方式自行终止。

线程池

在 Web 服务器中的多线程中,每当服务器收到请求时,它都会创建一个单独的线程来服务该请求。

创建线程时出现的一些问题如下:

  • 在服务请求之前创建线程所需的时间,以及一旦线程完成其工作就会被丢弃的事实。

  • 如果允许所有并发请求都在新线程中得到服务,则系统中并发活动线程的数量没有限制。

  • 无限线程可能会耗尽系统资源,例如 CPU 时间或内存。

线程池是在进程启动时创建一定数量的线程并将它们放入池中,在那里它们处于空闲状态并等待工作。

更新于:2021年11月30日

25K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告

© . All rights reserved.