目录
C++ 如何创建一个线程?线程的数量可以无限创建吗?最多能创建多少?
C++ 多线程对全局变量的读写,如果一个全局变量大部分是读,很少修改,有什么优化方式?
C++ 中的线程池如何处理不同的任务(不只是处理 http 请求)?
C++ 项目中线程池如何处理不同的任务,不只是处理 http 请求?
何时用协程,何时用线程?给出具体例子,为什么在这些场景要使用协程?
所有线程都访问同一个协程任务队列的并发导致锁的颗粒度比较大,如何解决(可以给每个线程分配单独的协程任务队列)?
用互斥锁,一个协程拥有资源,占用锁后,切换出去,新协程请求不到资源,陷入锁的阻塞队列,无法切出,怎么办?
自旋锁只适合短时间拥有锁,长时间会导致 CPU 空转,还有其他方法吗?
epoll 相对于 select 和 poll 的改进是什么?
C++ 项目中 select 和 epoll 的区别是什么?如果 5000 个客户端连接进来,调用 select 会怎样?会报错吗还是咋?
C++ 中的多进程通信方式有哪些?
在 C++ 中,常见的多进程通信方式有以下几种:
管道(Pipe)
管道是一种半双工的通信方式,它主要用于具有亲缘关系的进程之间通信,比如父子进程。其原理是在内核中开辟一块缓冲区,一个进程向这块缓冲区写入数据,另一个进程则从缓冲区读取数据。
在实现上,通过pipe
系统调用创建管道,会返回两个文件描述符,一个用于读操作,一个用于写操作。例如,父进程利用fork
函数创建子进程后,子进程会继承父进程打开的文件描述符。父进程可以往写文件描述符写入数据,像要传递一些简单的文本信息或者数字等,子进程便能从对应的读文件描述符读取到这些数据。不过管道通信的数据格式是字节流形式,没有特定结构,所以如果要传递复杂的数据结构,还需要自行进行序列化和反序列化等操作。而且管道通信有一定的局限性,比如当写端关闭时,读端读取完缓冲区数据后再读就会返回文件结束标志;当读端关闭时,写端继续写入数据