21xrx.com
2024-12-22 23:30:01 Sunday
登录
文章检索 我的文章 写文章
如何在C++中进行多线程编程
2023-06-28 10:23:04 深夜i     --     --
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方法等待条件变量的通知,然后解锁并执行任务。

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

  
  

评论区

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