Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 提高最后期限“例如:我应该替换”吗;睡眠;?_C++_Boost - Fatal编程技术网

C++ 提高最后期限“例如:我应该替换”吗;睡眠;?

C++ 提高最后期限“例如:我应该替换”吗;睡眠;?,c++,boost,C++,Boost,我有一个线程,我需要每10毫秒做一件事。所以我有非常简单的代码,比如: while (work) { // do something Sleep(10000); // boost sleep can be also used } 我听说一般不建议使用Sleep,如果我用deadline\u timer代替它,总体应用程序性能会更好,特别是我将避免昂贵的“上下文切换” 我是否应该将sleep更改为deadline\u timer,如果是,有人可以举个例子吗?使用sleep()可以

我有一个线程,我需要每10毫秒做一件事。所以我有非常简单的代码,比如:

while (work) {
    // do something
    Sleep(10000); // boost sleep can be also used
}
我听说一般不建议使用
Sleep
,如果我用
deadline\u timer
代替它,总体应用程序性能会更好,特别是我将避免昂贵的“上下文切换”

我是否应该将
sleep
更改为
deadline\u timer
,如果是,有人可以举个例子吗?

使用
sleep()
可以。我假设它是WindowsAPI函数,无论如何都需要毫秒,所以如果需要10毫秒,可能应该通过10而不是10000


像这样使用睡眠的简单程序中最大的问题可能是漂移。如果间隔需要非常精确,您将面临一些挑战。你没有说如果你的实际逻辑需要几毫秒才能完成,你是否关心会发生什么——你可以在10毫秒后开始下一次迭代,或者在更短的时间内“赶上”。这完全取决于10毫秒的要求


迭代之间的10毫秒延迟 如果应用程序在两次迭代之间需要10毫秒的延迟,那么睡眠就可以了。假设
work()
需要7毫秒才能完成,则时间线将产生以下结果:

Time | Action -------+------------ 0.000s | begin work 0.007s | finish work, block 0.017s | finish blocking, begin work 0.024s | finish work, block 0.034s | finish blocking, begin work Time | Action -------+------------ 0.000s | begin work 0.007s | finish work, block 0.010s | finish blocking, begin work 0.017s | finish work, block 0.020s | finish blocking, begin work
迭代之间的最大延迟为10ms 如果迭代之间的最大延迟为10ms,则执行工作所花费的时间需要从10ms的延迟中减少。假设
work()
需要7毫秒才能完成,则时间线将产生以下结果:

Time | Action -------+------------ 0.000s | begin work 0.007s | finish work, block 0.017s | finish blocking, begin work 0.024s | finish work, block 0.034s | finish blocking, begin work Time | Action -------+------------ 0.000s | begin work 0.007s | finish work, block 0.010s | finish blocking, begin work 0.017s | finish work, block 0.020s | finish blocking, begin work 另一个需要考虑的问题是,如果
work()
需要13毫秒才能完成,那么两个工作之间就不会有延迟,因为已经超过了最大延迟。但是,这会导致每13毫秒执行一次
work()
,而不是每10毫秒执行一次
work()

Time | Action -------+------------ 0.000s | begin work 0.013s | finish work, block 0.013s | finish blocking, begin work 0.026s | finish work, block 0.039s | finish blocking, begin work 本文可能会提供一个基本的介绍。总体思路是将工作添加到
io\u服务中
,每10毫秒就会选择一个运行
io\u服务的线程来调用
work()
。线程池大小可以根据完成
work()
所需的时间增加或减少。如果工作需要7毫秒,则单个线程可以异步等待计时器

#include <boost/asio/steady_timer.hpp>

boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);

void handle_timer(const boost::system::error_code& error);

void schedule_work()
{
  // Schedule more work.
  timer.expires_from_now(boost::chrono::milliseconds(10));
  timer.async_wait(&handle_timer);
}

void handle_timer(const boost::system::error_code& error)
{
  if (error) return;
  schedule_work();
  work();
}

int main()
{
  // Add work to io_service.
  schedule_work();

  // Create 2 threads that will run io_service.
  boost::thread_group threads;
  for (std::size_t i = 0; i < 2; ++i)
    threads.create_thread(boost::bind(
      &boost::asio::io_service::run, &io_service));

  // Wait for threads to finish.
  threads.join_all();
}
#包括
boost::asio::io_服务io_服务;
boost::asio::稳定定时器(io\u服务);
无效句柄计时器(常量boost::system::error\u代码和错误);
无效附表_工作()
{
//安排更多的工作。
timer.expires_from_now(boost::chrono::毫秒(10));
异步等待(&handle\u timer);
}
无效句柄计时器(常量boost::system::error\u代码和错误)
{
如果(错误)返回;
工作进度表();
工作();
}
int main()
{
//将工作添加到io_服务。
工作进度表();
//创建2个将运行io_服务的线程。
boost::线程组线程;
对于(标准::尺寸_t i=0;i<2;++i)
创建线程(boost::bind)(
&boost::asio::io_服务::运行,&io_服务);
//等待线程完成。
线程。连接所有线程();
}

在引入并发以满足最后期限时,请验证
work()
是否是线程安全的。

这里有一些示例:我已经阅读了这些示例,但它们并不完整。在第一个示例中,不清楚io_服务是什么
boost::asio::deadline_定时器(io_服务)对我来说,还不清楚我应该使用阻塞版本还是异步版本。要使用截止时间计时器,您需要了解更多关于Boost ASIO的信息。IO_服务本质上是一个调度程序。睡眠是否良好以及是否应该使用同步或异步等待取决于您试图实现的目标。你现在在什么环境下使用睡眠?您对它阻塞而无法取消这一事实是否满意?@javapowered,一个简单的问题并不意味着答案也同样简单。根据您的陈述,所提供的示例太复杂,您的问题看起来像是“请做我的家庭作业”。据我所知,使用
睡眠
比使用boost
截止时间计时器更糟糕,因为
睡眠
会引入更多的上下文切换。10毫秒对于计算机来说是相当长的时间。你应该停止担心这一点,继续前进,除非/直到你分析你的应用程序并发现这是一个问题。计算机的10毫秒长或短时间无关紧要。我只需要有效地睡眠10毫秒。但需要担心的一点是,睡眠调用可能会被中断并早起(通过sleep()查看Unix类型的系统和SIGALM行为)。@JohnZwinck显然不够长,无法满足某些Windows操作系统的时间要求,因为这些操作系统的计时器精度差异很大(当我遇到此问题时,vista上有大约15毫秒的变化窗口).wow谢谢你这么完整的回答!我的主要要求是避免额外的上下文切换,即尽可能有效地睡眠。我不需要也不需要最大平均10毫秒延迟。我只需要睡眠一点以避免CPU旋转。当然我可以使用一些通知机制,但我想从睡眠开始。可能需要std::chrono::毫秒(10)
#include <boost/asio/steady_timer.hpp>

boost::asio::io_service io_service;
boost::asio::steady_timer timer(io_service);

void handle_timer(const boost::system::error_code& error);

void schedule_work()
{
  // Schedule more work.
  timer.expires_from_now(boost::chrono::milliseconds(10));
  timer.async_wait(&handle_timer);
}

void handle_timer(const boost::system::error_code& error)
{
  if (error) return;
  schedule_work();
  work();
}

int main()
{
  // Add work to io_service.
  schedule_work();

  // Create 2 threads that will run io_service.
  boost::thread_group threads;
  for (std::size_t i = 0; i < 2; ++i)
    threads.create_thread(boost::bind(
      &boost::asio::io_service::run, &io_service));

  // Wait for threads to finish.
  threads.join_all();
}