- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我很震惊地跟踪这个简单的代码:
#include <thread>
void foo()
{
for (int i = 0; i < 1000000; ++i) {
std::this_thread::sleep_for(std::chrono::nanoseconds(1));
}
}
int main()
{
std::thread t(foo);
t.join();
}
你猜怎么着? sleep_for 每次都调用 FreeLibrary!
kernel32.dll!_FreeLibraryStub@4()
msvcr120d.dll!Concurrency::details::DeleteAsyncTimerAndUnloadLibrary(_TP_TIMER * timer) Line 707
msvcr120d.dll!Concurrency::details::_Timer::_Stop() Line 111
msvcr120d.dll!Concurrency::details::_Timer::~_Timer() Line 100
msvcr120d.dll!`Concurrency::wait'::`7'::TimerObj::~TimerObj()
msvcr120d.dll!Concurrency::wait(unsigned int milliseconds) Line 155
test826.exe!std::this_thread::sleep_until(const xtime * _Abs_time) Line 137
test826.exe!std::this_thread::sleep_for<__int64,std::ratio<1,1000000000> >(const std::chrono::duration<__int64,std::ratio<1,1000000000> > & _Rel_time) Line 162
test826.exe!foo() Line 6
为什么 sleep_for 必须调用 FreeLibrary ?
此程序使用 boost 库需要 2 秒,使用 msvcrt( Release模式)需要 > 3 分钟(失去耐心)。我无法想象。
最佳答案
在 Visual C++ 2013 中,大多数 C++ 标准库并发功能位于 Concurrency Runtime (ConcRT) 之上. ConcRT 是一种工作窃取运行时,可提供协作调度和阻塞。
此处,Concurrency::wait
使用线程池计时器来执行等待。它使用 LoadLibrary
/FreeLibrary
在计时器挂起期间增加托管 ConcRT 运行时的模块的引用计数。这确保模块在等待期间不会被卸载。
我不是 ConcRT 专家(甚至不是专家),所以我不能 100% 确定可以在此处卸载 ConcRT 模块的确切场景是什么。我知道我们对 std::thread
和 _beginthreadex
进行了类似的更改,以获取对托管线程回调的模块的引用,以确保该模块在线程执行时不会被卸载。
在 Visual C++ 2015 中,C++ 标准库并发功能被修改为直接位于 Windows 操作系统原语(例如 CreateThread
、Sleep
等)之上,而不是 ConcRT .这样做是为了提高性能,解决将 C++ 线程功能与操作系统功能混合使用时的正确性问题,并作为更普遍地强调 ConcRT 的一部分。
请注意,在 Windows 上, sleep 精度以毫秒为单位,零毫秒的 sleep 通常意味着“在回来找我之前去做其他有用的工作”。如果您使用 Visual C++ 2015 编译您的程序,则每次调用 wait_for
都会依次调用 Sleep(0)
,这“导致线程放弃其时间片的剩余部分到任何其他准备运行的线程。”
关于c++ - 为什么 sleep_for 调用 FreeLibrary?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32230632/
我正在尝试做一件非常简单的事情(但花了几个小时没有结果):打印一行,睡一会儿,打印第二行。我希望下面的代码可以做到这一点,但是,它首先会休眠,然后同时打印两行!谁能看到我在这里缺少的东西? 这是完整的
我想在线程内运行一个循环,每毫秒计算一些数据。但是我在 sleep 功能上遇到了麻烦。它睡得太久了。 我在 visual studio 中创建了一个基本的控制台应用程序: #include #inc
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: std::this_thread::sleep_for() and GCC 尝试编写一个简单的计时器和一些代
我正在使用 this_thread::sleep_for() 进行测试创建一个类似于 cout 的对象, 除了在打印字符串时它会在每个字符之间有一个小的延迟。但是,它不是在每个字符之间等待 0.1 秒
我有一个包含两个线程的简单程序,一个将 packaged_task 推送到一个 deque 中,另一个执行它。在任务中有一个 this_thread::sleep_for,我希望只有“进程”线程会等待
有人可以解释这两种停止线程然后再继续的方式在行为上的区别吗? Sleep(); //from Win32 std::this_thread::sleep_for(); 我评论的是多线程行为,而不是系统
我正在用纯 c++11 编写,想在关闭它后做一个简单的“等待 x 秒并打开一个成员变量”。此示例中类的成员变量是“动画”的标志。 cout animating = false;
我很震惊地跟踪这个简单的代码: #include void foo() { for (int i = 0; i >(const std::chrono::duration > & _Rel
在我的应用程序中,我想用这段代码显示一些图像 myImage = scene->addPixmap(image); myImage->setOffset(x, y); 然后我想睡几秒钟: std::t
在使用 std::this_thread::sleep_for() 毫秒及以上时,是否需要考虑任何已知的可移植性问题? 在我正在进行的项目中,我希望使用 Microsoft 的 Sleep() 到 n
我正处于使用 gcc 在 Linux 下将一些遗留 C++ 代码升级到 C++11 的阶段。在尝试设置优先级时,我想到了以下问题。将对 usleep 的调用与对 std::this_thread::s
我有一个循环,我想确保它在每个循环中运行(大约)固定的时间量。 我正在使用 sleep_for 来实现此行为,但我也希望程序能够在不完全支持标准线程库的环境中编译。现在我有这样的东西: using n
请注意,这不是关于 std::condition_variable::wait_for() 的问题。我知道这可能会虚假唤醒。 我的程序的行为表明这个问题的答案是肯定的,但是 STL 文档对于 cond
std::this_thread::sleep_for()或usleep() 在main()中使用哪种更好?这可能很愚蠢,但是我是C++ 11功能的新手。 最佳答案 前者实际上是可移植的C++函数。后
如果我并排放置两个调用来确定最小可测量持续时间: // g++ -std=c++11 -O3 -Wall test.cpp #include typedef std::chrono::high_re
我正在尝试在 Google 测试中 sleep 。根据this post ,我可以使用以下内容: #include #include TEST_F(TestSuite, TestOne) {
我正在使用 VS2012,但我遇到以下示例的问题: #include #include int main() { // doesn't compile and I don't unders
std::this_thread::sleep_for(std::chrono::milliseconds(1000)); 编译:clang++ main.cpp -o main.exe -g -st
谁能说出以下示例的问题所在? 它每秒产生 65 帧而不是 300 帧。 #define WIN32_LEAN_AND_MEAN #include #include #include #inclu
当我尝试编译这个简单的程序时: #include void f() { std::this_thread::sleep_for(std::chrono::seconds(3)); } int ma
我是一名优秀的程序员,十分优秀!