21xrx.com
2024-12-22 21:56:08 Sunday
登录
文章检索 我的文章 写文章
使用C++的future、promise和条件变量。
2023-07-09 09:20:51 深夜i     --     --
C++ Future Promise 条件变量 多线程编程

C++是一种面向对象的编程语言,它提供了很多强大的特性,如多线程和并发编程等。其中,future、promise和条件变量是C++中常用的并发编程工具,它们可以帮助我们实现并发编程。在本文中,我们将会学习这些并发编程工具的基本用法和实现原理。

Future是一种异步操作的结果,它可以用于获取异步操作的结果,也可以用于等待异步操作的完成。在C++中,future有两种类型,一种是std::future,另一种是std::shared_future。std::future只能从一个线程中访问,而std::shared_future可以从多个线程中访问。在使用std::future时,我们需要首先创建一个异步任务,然后获取其结果。例如:


#include <iostream>

#include <future>

int main()

{

  std::future<int> fut = std::async([]() return 42; );

  int result = fut.get();

  std::cout << result << std::endl;

  return 0;

}

在上面的代码中,我们使用std::async创建了一个异步任务,任务的返回值是42。然后,我们通过fut.get()获取异步任务的结果,并将结果打印到控制台上。

Promise是一种用于传递异步操作结果的工具,它可以将异步任务的结果传递给future。在C++中,promise有两种类型,一种是std::promise,另一种是std::shared_promise。std::promise只能传递一个值,而std::shared_promise可以传递多个值。在使用promise时,我们需要首先创建一个promise对象,然后将其与future关联起来。例如:


#include <iostream>

#include <future>

int main()

{

  std::promise<int> prom;

  std::future<int> fut = prom.get_future();

  std::thread t([](std::promise<int>& prom) { prom.set_value(42); }, std::ref(prom));

  int result = fut.get();

  std::cout << result << std::endl;

  t.join();

  return 0;

}

在上面的代码中,我们首先创建了一个promise对象和一个future对象,然后将它们关联起来。接着,我们创建了一个新的线程,该线程会将值42传递给promise对象。最后,我们通过fut.get()获取异步任务的结果,并将结果打印到控制台上。

条件变量是一种用于线程之间通信的工具,它允许一个线程等待另一个线程发出信号。在C++中,条件变量通常与互斥锁一起使用。例如:


#include <iostream>

#include <thread>

#include <mutex>

#include <condition_variable>

std::mutex mtx;

std::condition_variable cv;

bool ready = false;

void worker_thread()

{

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

  while (!ready) {

    cv.wait(lock);

  }

  std::cout << "Worker thread is running!" << std::endl;

}

int main()

{

  std::thread t(worker_thread);

  {

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

    ready = true;

  }

  cv.notify_one();

  t.join();

  return 0;

}

在上面的代码中,我们首先创建了一个互斥锁和一个条件变量。然后,我们创建了一个工作线程,在工作线程中我们首先获得互斥锁,然后等待条件变量。在主线程中,我们首先通过锁来修改ready变量的值,然后通过条件变量发送一个信号,通知工作线程可以开始工作了。最后,我们等待工作线程的结束,并发出join操作。

总之,future、promise和条件变量是C++中常用的并发编程工具,它们可以帮助我们实现异步编程和线程之间的通信。在使用它们时,我们需要注意线程安全和数据同步的问题,并合理选择合适的并发编程工具来满足我们的需求。

  
  

评论区

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