21xrx.com
2024-12-23 02:51:24 Monday
登录
文章检索 我的文章 写文章
C++多线程编程实战代码:打造高效并发程序
2023-06-27 06:12:00 深夜i     --     --
C++ 多线程编程 实战代码 高效并发程序 打造

C++是一种高效的编程语言,而多线程编程则是C++编程中的关键技术之一。多线程编程可以使程序并发运行,从而提高程序的效率和响应速度。本文将介绍一些C++多线程编程实战代码,帮助读者打造高效的并发程序。

一、基本概念

在开始C++多线程编程之前,首先需要了解一些基本概念。线程是程序中一个独立的执行流,每个线程都有自己的栈空间和寄存器状态。多线程编程就是在程序中同时运行多个线程,从而实现并发执行。多线程编程中常用的类型有互斥锁、条件变量和信号量等。

二、互斥锁

互斥锁是一种用于保护共享资源的机制。在多线程编程中,如果多个线程同时访问某个共享资源,很可能会导致数据的不一致,因此需要使用互斥锁来保证同一时刻只有一个线程访问共享资源。下面是一个使用互斥锁的C++多线程编程实例代码:


#include <iostream>

#include <thread>

#include <mutex>

std::mutex mtx;

void func(int& count)

{

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

  {

    std::lock_guard<std::mutex> lock(mtx);

    count++;

  }

}

int main()

{

  int count = 0;

  std::thread t1(func, std::ref(count));

  std::thread t2(func, std::ref(count));

  t1.join();

  t2.join();

  std::cout << "count: " << count << std::endl;

  return 0;

}

在上面的代码中,使用了std::mutex来创建一个互斥锁对象,然后使用std::lock_guard来保证互斥锁的正确使用。在func函数中使用了std::lock_guard来对共享资源count进行了互斥访问。当其中一个线程已经占用互斥锁时,其他线程必须等待,直到互斥锁被释放后才能继续使用。

三、条件变量

条件变量是一种线程间同步机制,可以用来进行线程间的通信。当某个条件满足时,等待条件变量的线程将被唤醒,从而可以继续执行。下面是一个使用条件变量的C++多线程编程实例代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mtx;

std::condition_variable cv;

bool ready = false;

void func()

{

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

  while (!ready) cv.wait(lock);

  std::cout << "func called" << std::endl;

}

int main()

{

  std::thread t(func);

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

  {

    std::lock_guard<std::mutex> lock(mtx);

    ready = true;

  }

  cv.notify_one();

  t.join();

  return 0;

}

在上面的代码中,使用了std::condition_variable来创建一个条件变量对象,然后在func函数中使用了std::unique_lock来锁定互斥锁和条件变量。当ready为false时,调用cv.wait(lock)函数来等待条件变量被唤醒。在主线程中将ready设置为true,并调用cv.notify_one()函数来唤醒func函数中等待的线程。

四、信号量

信号量是一种经典的同步机制,用于控制并发进程对共享资源的访问。在多线程编程中,信号量可以用来实现多线程之间的同步和互斥。下面是一个使用信号量的C++多线程编程实例代码:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

#include <semaphore.h>

sem_t sem;

void func()

{

  sem_wait(&sem);

  std::cout << "func called" << std::endl;

  sem_post(&sem);

}

int main()

{

  sem_init(&sem, 0, 1);

  std::thread t(func);

  t.join();

  sem_destroy(&sem);

  return 0;

}

在上面的代码中,使用了sem_init来初始化信号量,然后在func函数中使用了sem_wait和sem_post来控制共享资源的访问。当信号量的值为0时,sem_wait函数将会被阻塞,直到信号量的值大于0。当func函数退出时,调用sem_post函数来释放信号量。

五、总结

本文介绍了C++多线程编程中常用的一些实战代码,包括互斥锁、条件变量和信号量。这些机制可以帮助程序员构建高效的并发程序,提高程序的效率和响应速度。需要注意的是,在并发编程中需要小心处理共享资源的访问,避免出现数据不一致等问题。

  
  

评论区

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