我有以下代码(手工复制):
// Simple stop watch class basically takes "now" as the start time and
// returns the diff when asked for.
class stop_watch {...}
// global var
std::thread timer_thread;
void start_timer(int timeout_ms)
{
timer_thread = std::thread([timeout_ms, this](){
stop_watch sw;
while (sw.get_elapsed_time() < timeout_ms)
{
// Here is the sleep to stop from hammering a CPU
std::this_thread::sleep_for(std::chrono::milliseconds(10));
}
// Do timeout things here...
std::cout << "timed out!" << std::endl;
})
}
Run Code Online (Sandbox Code Playgroud)
我不想太沉迷于我写的课程的细节,所以这是一个非常简化的版本.完整的类调用函数回调并具有取消计时器等的变量...
我只想专注于"睡眠"部分.我可以在没有睡眠的情况下实现这样的事情,还是有更好的方法来实现它? - 还是睡得很好? - 我认为睡眠通常是糟糕设计的标志(我已经读过几个地方)......但我想不出一种方法来实现没有一个计时器:(
附加说明:计时器应该能够随时停止/唤醒.只是为了清晰起见而添加它,因为它似乎影响了要采用的解决方案.在我的原始代码(不是这个代码片段)中,我使用了一个可以突破循环的原子bool标志.
在我的应用程序中,线程需要暂停一段时间(100个时钟周期).暂停的一种方法是调用nanosleep,但我想它需要对内核进行系统调用.现在我想暂停而不去内核.
请注意,我有足够的内核来运行我的线程,并且我将每个线程绑定到一个单独的内核,因此即使是可以暂停内核一段时间的指令也会很好.我正在使用x86.我只是希望线程在暂停时暂停.我不希望繁忙的循环或系统调用内核.是否有可能做到这一点?我可以暂停一个帖子的最短时间是多少?
我正在C中制作win32程序.
当您运行多个线程,并且其中一个线程正在等待事件时(WaitForSingleObject()例如使用),该线程是否仍然获得其完整的CPU时间片?
换句话说,操作系统是否知道线程不需要其时间片,直到其中一个事件被发出信号?