21xrx.com
2025-03-27 20:39:34 Thursday
文章检索 我的文章 写文章
C++多进程多线程面试题
2023-07-06 01:30:21 深夜i     27     0
C++ 多进程 多线程 面试题 并发编程

在计算机编程领域中,C++多进程和多线程都是非常重要的主题,它们不仅可以大幅提高代码执行效率,还可以带来更好的用户体验。因此,在C++面试中,多进程和多线程成为热门考察方向之一。下面,我们来看一些常见的多进程和多线程C++面试题。

1. 什么是多线程和多进程?它们之间有何不同点?

多进程是指在操作系统中同时运行多个进程,每个进程都是一个独立的程序,拥有自己的内存空间,进程之间互相独立。而多线程是指在一个程序内创建多个线程来执行任务,在同一进程中运行的多个线程共享进程的内存空间。

多线程相较多进程拥有以下优点:更轻量级、更容易共享信息、执行速度更快,而多进程更安全,可靠性高。

2. 如何创建一个线程?

要在C++中创建线程,需要使用 头文件提供的线程类。例如:

#include <thread>
#include <iostream>
//线程函数
void thread_function(int a)
  std::cout << "Thread function " << a << std::endl;
//主函数
int main(){
  //创建线程 
  std::thread t(thread_function, 10);
  //等待线程执行完成
  t.join();
  return 0;
}

在上述示例代码中,我们使用std::thread类创建了一个线程t,并将该线程的执行函数设置为thread_function。这个函数将输出“Thread function 10”的消息。

3. C++中如何创建多个线程并控制它们的执行顺序?

要创建多个线程,我们可以使用std::vector和std::for_each算法,在整个线程列表中轮流运行线程。例如:

#include <iostream>
#include <thread>
#include <vector>
#include <algorithm>
// 线程函数
void thread_function(int a)
  std::cout << "Thread function " << a << std::endl;
// 主函数
int main(){
  std::vector<std::thread> threads;
  for(int i=0; i<10; i++){
    threads.push_back(std::thread(thread_function, i));
  }
  // 控制线程执行顺序
  std::for_each(threads.begin(), threads.end(), [](std::thread& t){
    t.join();
  });
  return 0;
}

在上述示例代码中,我们向std::vector中添加了10个线程,并使用std::for_each算法按顺序将这些线程加入执行队列中。

4. 什么是互斥锁(Mutex)?

互斥锁是一种同步机制,用于管理线程访问共享资源的方式。当一个线程申请了一个锁并获得了该锁时,其他线程就无法访问该锁保护的共享资源。

为了在C++代码中实现互斥锁,可以使用std::mutex类:

#include <iostream>
#include <thread>
#include <mutex>
//创建互斥锁
std::mutex myMutex;
//线程函数
void thread_function(int a){
  //锁定互斥锁
  std::lock_guard<std::mutex> myLockGuard(myMutex);
  std::cout << "Thread function " << a << std::endl;
  //解锁互斥锁
}
//主函数
int main(){
  std::vector<std::thread> threads;
  for(int i=0; i<10; i++){
    threads.push_back(std::thread(thread_function, i));
  }
  //等待线程执行完成
  std::for_each(threads.begin(), threads.end(), [](std::thread& t){
    t.join();
  });
  return 0;
}

在上述示例代码中,我们通过创建std::mutex实例myMutex,然后在每个线程函数中使用std::lock_guard myLockGuard(myMutex)获取锁,并在执行完成后释放。

总结:

C++中多进程多线程可以带来较高的性能提升,因此在C++相关职位的面试中经常被考察。上述列举的四个问题是常见的C++面试题,熟练掌握这些问题可以大幅提升你在面试中的竞争力。当然,建议多多实践和学习,掌握更多的多线程和多进程应用。

  
  

评论区