什么是线程问题?
我们可以讨论在设计多线程程序时需要考虑的一些问题。这些问题如下:
fork() 和 exec() 系统调用
fork() 用于创建副本进程。fork() 和 exec() 系统调用的含义在多线程程序中发生了变化。
如果程序中的一个线程调用了 fork(),新进程是否会复制所有线程,或者新进程是单线程的?例如,一些 UNIX 系统选择使用两种版本的 fork(),一种复制所有线程,另一种只复制调用 fork() 系统调用的线程。
如果线程调用 exec() 系统调用,则 exec() 参数中指定的程序将替换整个进程,包括所有线程。
信号处理
通常,信号用于 UNIX 系统中通知进程已发生特定事件。接收到的信号可以是同步的或异步的,具体取决于事件的来源和原因。
所有信号,无论是同步的还是异步的,都遵循以下相同模式:
特定事件的发生会生成信号。
信号传递给进程。
一旦传递,必须处理信号。
取消
线程取消是在线程完成之前终止线程的任务。
**例如**:如果多个数据库线程并发地搜索数据库,并且一个线程返回结果,则其余线程可能会被取消。
目标线程是要取消的线程,目标线程的取消可能发生在两种不同的场景中:
**异步取消**:一个线程立即终止目标线程。
**延迟取消**:目标线程定期检查是否应终止,从而使其有机会以普通方式自行终止。
线程池
在 Web 服务器中的多线程中,每当服务器收到请求时,它都会创建一个单独的线程来服务该请求。
创建线程时出现的一些问题如下:
在服务请求之前创建线程所需的时间,以及一旦线程完成其工作就会被丢弃的事实。
如果允许所有并发请求都在新线程中得到服务,则系统中并发活动线程的数量没有限制。
无限线程可能会耗尽系统资源,例如 CPU 时间或内存。
线程池是在进程启动时创建一定数量的线程并将它们放入池中,在那里它们处于空闲状态并等待工作。
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP