21xrx.com
2025-03-29 00:47:55 Saturday
文章检索 我的文章 写文章
C++如何进行等待操作
2023-06-22 11:48:20 深夜i     18     0
C++ 等待 延时 sleep函数 多线程

C++是一种非常强大的编程语言,它可以用来开发各种类型的应用程序,包括网络应用、游戏、桌面应用等等。在程序的执行过程中,有时需要进行等待操作,比如等待用户输入、等待文件读取等等。本文将介绍几种常见的C++等待操作方法。

1. 线程等待

在多线程编程中,我们可以使用条件变量或互斥锁来实现线程的等待。条件变量可以让线程在一定条件下等待,互斥锁可以让线程互斥地访问共享资源。

下面是一个用条件变量实现线程等待的示例:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>
std::mutex mu;
std::condition_variable cond;
bool ready = false;
void worker()
{
  std::unique_lock<std::mutex> lock(mu);
  while (!ready)
  {
    cond.wait(lock);
  }
  std::cout << "worker thread job done" << std::endl;
}
int main()
{
  std::thread t(worker);
  std::this_thread::sleep_for(std::chrono::seconds(5));
  {
    std::lock_guard<std::mutex> lock(mu);
    ready = true;
    cond.notify_one();
  }
  t.join();
  return 0;
}

在这个示例中,我们创建了一个线程t,在这个线程中调用的是worker函数。在worker函数中,我们使用了std::condition_variable来实现线程的等待。首先获取了一个std::unique_lock 对象来加锁,然后进入了一个while循环,不停地检查ready变量是否为true,如果不是,则调用cond.wait(lock)来等待。当ready变量变为true时,调用cond.notify_one()来唤醒所有在等待条件变量上的线程。最后在线程结束时join。

2. 线程休眠

如果需要在特定的时间内暂停线程的执行,可以使用std::this_thread::sleep_for()函数来实现。这个函数的参数是std::chrono::duration类型的对象,可以设置秒数、毫秒数、微秒数等等。

下面是一个简单的线程休眠示例:

#include <iostream>
#include <thread>
int main()
{
  std::cout << "start sleeping" << std::endl;
  std::this_thread::sleep_for(std::chrono::seconds(5));
  std::cout << "finish sleeping" << std::endl;
  return 0;
}

在这个示例中,我们使用了std::this_thread::sleep_for(std::chrono::seconds(5))函数来让程序暂停5秒钟,然后继续执行。

3. 循环等待

很多时候,在程序中需要等待某个事件发生时,我们可以使用循环等待的方式。这种方式的实现非常简单,就是使用while循环不停地检查某个条件是否成立。如果条件成立,则跳出循环,否则继续等待。

下面是一个循环等待的示例:

#include <iostream>
#include <thread>
bool is_file_ready()
  // do something
  return false;
int main()
{
  while(!is_file_ready())
  {
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 休眠1秒钟
  }
  std::cout << "file is ready" << std::endl;
  return 0;
}

在这个示例中,我们定义了一个is_file_ready()函数来检查文件是否就绪,然后在主函数中使用了while循环来等待文件就绪。在while循环中,我们使用std::this_thread::sleep_for(std::chrono::seconds(1))函数来每秒钟检查一次文件是否就绪。如果文件就绪,则跳出循环,否则继续等待。

总结

上述三种方法都是C++中常用的等待操作的实现方式。在程序中,我们需要根据实际情况选择合适的方法。线程等待适用于多线程编程中,线程休眠适用于等待特定的时间,循环等待适用于持续等待某个条件成立。无论哪种方法,都要根据具体的使用场景来进行灵活的选择。

  
  

评论区

请求出错了