21xrx.com
2025-03-13 23:36:40 Thursday
登录
文章检索 我的文章 写文章
C++如何进行等待操作
2023-06-22 11:48:20 深夜i     --     --
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++中常用的等待操作的实现方式。在程序中,我们需要根据实际情况选择合适的方法。线程等待适用于多线程编程中,线程休眠适用于等待特定的时间,循环等待适用于持续等待某个条件成立。无论哪种方法,都要根据具体的使用场景来进行灵活的选择。

  
  

评论区

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