21xrx.com
2024-12-22 21:37:52 Sunday
登录
文章检索 我的文章 写文章
「C++多线程」面试题——CSDN
2023-07-07 18:41:49 深夜i     --     --
C++ 多线程 面试题 编程语言 并发编程

在现代编程语言中,多线程程序已经成为一种非常重要的编程技巧,而在C++中,多线程程序同样也是非常常见的。正因为如此,C++多线程技术也经常被用作招聘面试的考察重点。本文将为大家详细介绍C++多线程面试题。

1. 什么是多线程程序?

多线程程序指的是在一个进程中同时执行多个线程的程序。线程是被程序员显式创建和启动的执行流,程序员可以通过多线程编程技术来利用多个计算机核心以及多个处理器来提高程序的执行效率和响应速度。

2. C++多线程的实现方式?

C++多线程的实现方式有多种,其中最常见的是使用POSIX线程库pthread库。此外,C++11标准也提供了内置的多线程库std::thread,以及锁、条件变量、原子类型等线程同步和数据访问并发控制组件。

3. 如何创建和启动线程?

在C++中,可以使用std::thread构造器来创建一个新的线程对象,然后调用线程对象的start()方法来启动线程。具体代码如下:

 c++

#include <iostream>

#include <thread>

void thread_function()

  std::cout << "Thread function executing..." << std::endl;

int main()

{

  std::thread t(thread_function);

  std::cout << "Main thread executing..." << std::endl;

  t.join();

  return 0;

}

上述代码创建了一个线程对象t,其中传入了一个线程函数thread_function,然后调用t.join()来等待线程t执行结束。

4. 如何进行线程同步?

在线程中,多个线程需要共享资源,因此需要对共享资源进行保护来避免数据竞争。C++提供了一些线程同步机制,比如互斥锁、条件变量、原子类型等。

其中,最常用的是互斥锁,可以使用std::mutex来实现。示例代码如下:

 c++

#include <iostream>

#include <thread>

#include <mutex>

std::mutex mu;

int count = 0;

void thread_function()

{

  for(int i=0; i<100000; ++i) {

    mu.lock();

    ++count;

    mu.unlock();

  }

}

int main()

{

  std::thread t1(thread_function);

  std::thread t2(thread_function);

  t1.join();

  t2.join();

  std::cout << "Final count value is " << count << std::endl;

  return 0;

}

上述代码定义了一个计数器count和一个互斥量mu,线程函数中使用std::mutex::lock()和std::mutex::unlock()来对count进行加1操作,从而避免多个线程同时访问count导致的数据竞争问题。

5. 如何进行线程通信?

线程通信是多线程编程的重要组成部分,它可以让不同线程之间进行数据的交换、信息的传递等。C++提供了条件变量std::condition_variable来实现线程间的通信。

条件变量可以在一个线程等待事件的发生,直到其他线程发出通知,唤醒等待的线程。示例代码如下:

 c++

#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mu;

std::condition_variable cv;

bool flag = false;

void thread_function()

{

  std::unique_lock<std::mutex> lock(mu);

  cv.wait(lock, [](){return flag;});

  std::cout << "Thread function executing..." << std::endl;

}

int main()

{

  std::thread t(thread_function);

  std::this_thread::sleep_for(std::chrono::seconds(1));

  flag = true;

  cv.notify_one();

  t.join();

  return 0;

}

上述代码定义了一个条件变量cv和一个标志位flag,线程函数中使用std::condition_variable::wait()来等待事件的发生,主函数中使用cv.notify_one()来唤醒等待的线程。

本文只是介绍了C++多线程面试题的一部分,C++多线程相对来说是比较难的编程技术,也是一个重要的技能。如果想追求更高的工作机会和收入,那么就需要掌握C++多线程技术。

  
  

评论区

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