21xrx.com
2025-03-21 23:33:59 Friday
文章检索 我的文章 写文章
如何在C++中进行多线程编程
2023-06-28 10:23:04 深夜i     11     0
C++ 多线程 编程 线程同步 线程池

在C++中,多线程编程可以显著提高程序的性能和并发能力。但是,与单线程编程不同,多线程编程需要开发者更加注意线程之间的同步和通信,以确保程序的正确性和稳定性。下面是在C++中进行多线程编程的步骤和技巧。

步骤1:创建线程

在C++中,可以使用thread类创建线程。该类定义在 头文件中,其构造函数接受一个函数指针和该函数的参数。例如:

#include <iostream>
#include <thread>
void hello() {
  std::cout << "Hello from the other thread!\n";
}
int main() {
  std::thread t(hello);
  t.join();
  return 0;
}

上述代码创建了一个新的线程t,该线程将执行hello函数。join方法等待线程执行完成之后再继续执行主线程。可以在hello函数中添加一些复杂的计算或者IO操作,以测试多线程编程的效率。

步骤2:线程同步

当多个线程同时访问共享资源时,可能会出现问题。为了确保程序的正确性,需要使用互斥锁或者信号量等机制实现线程同步。互斥锁可以在对共享资源进行访问时锁定,在使用结束之后解锁。示例代码如下:

#include <iostream>
#include <thread>
#include <mutex>
std::mutex mtx;
void print_block(int n, char c) {
  mtx.lock();
  for (int i = 0; i < n; i++)
    std::cout << c;
  
  std::cout << std::endl;
  mtx.unlock();
}
int main() {
  std::thread t1(print_block, 50, '*');
  std::thread t2(print_block, 50, '+');
  t1.join();
  t2.join();
  return 0;
}

上述代码使用了互斥锁(mtx)来保证两个线程输出一致。如果不使用锁,则两个线程的输出会相互交叉,导致结果不确定。

步骤3:线程通信

当多个线程需要协同完成一项任务时,需要进行线程通信。线程通信可以使用某些同步原语,如条件变量或者信号量。条件变量可以用来通知等待线程,某个特定的事件已经发生。示例代码如下:

#include <iostream>
#include <thread>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
bool ready = false;
void worker_thread() {
  std::unique_lock<std::mutex> lk(mtx);
  cv.wait(lk, []{return ready;});
  std::cout << "Worker thread is processing data\n";
}
int main() {
  std::thread worker(worker_thread);
  std::cin.get();
  {
    std::lock_guard<std::mutex> lk(mtx);
    ready = true;
  }
  cv.notify_one();
  worker.join();
  std::cout << "Worker thread has finished processing\n";
  return 0;
}

上述代码使用了条件变量(cv)实现了线程通信。主线程结束读取输入后,通知工作线程继续执行。工作线程在获得锁之后,调用wait方法等待条件变量的通知,然后解锁并执行任务。

多线程编程虽然可以显著提高程序的性能,但同时也会增加代码的复杂性。在编写多线程程序时,需要特别注意线程之间的同步和通信问题,以确保程序的正确性和稳定性。

  
  

评论区