21xrx.com
2024-09-19 09:14:37 Thursday
登录
文章检索 我的文章 写文章
C++多进程多线程面试题
2023-07-06 01:30:21 深夜i     --     --
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++面试题,熟练掌握这些问题可以大幅提升你在面试中的竞争力。当然,建议多多实践和学习,掌握更多的多线程和多进程应用。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复