相关疑难解决方法(0)

Windows 7:过冲C++ std :: this_thread :: sleep_for

我们的代码是用C++ 11(VS2012/Win 7-64bit)编写的.C++库提供了sleep_for我们使用的功能.我们观察到C++ sleep_for有时会出现大的超调.换句话说,我们请求睡眠15毫秒,但睡眠结果是例如100毫秒.当系统负载很高时,我们会看到这一点.

我的第一反应是:"当然,如果系统上有很多负载而其他线程正在使用CPU,那么睡眠"需要更长时间".然而,"有趣"的是,如果我们用sleep_forWindows API"Sleep"调用替换,那么我们就不会看到这种行为.我还看到sleep_for水下的函数调用了Window API Sleep方法.

sleep_for状态的文档:

该函数至少Rel_time指定的时间内阻塞调用线程.此函数不会抛出任何异常.

从技术上讲,功能正在发挥作用.但是我们没想到看到C++ sleep_for和常规Sleep(Ex)函数之间存在差异.

有人可以解释这种行为吗?

c++ windows winapi sleep

9
推荐指数
1
解决办法
1735
查看次数

std :: thread导致DLLMain中的死锁

所以,这就是我所说的:std很复杂.

在VS2013中,这个简单的程序会导致死锁.

#include <thread>
#include <windows.h>

void foo()
{
}

void initialize()
{
    std::thread t(foo);
}

BOOL APIENTRY DllMain(HMODULE, DWORD reason, LPVOID)
{
    switch (reason)
    {
    case DLL_PROCESS_ATTACH:
        initialize();
        break;
    case DLL_THREAD_ATTACH:
        break;
    case DLL_THREAD_DETACH:
        break;
    case DLL_PROCESS_DETACH:
        break;
    }
    return TRUE;
}
Run Code Online (Sandbox Code Playgroud)

在DLLMain中创建一个线程是完全错误的?这不是真的.从Microsoft的"创建DLL的最佳实践"文档:" 如果不与其他线程同步,创建一个线程就可以工作 ".所以CreateThread工作,_beginthreadex工作,boost :: thread工作,但std :: thread不起作用.这是调用堆栈:

ntdll.dll!_NtWaitForSingleObject@12()
KernelBase.dll!_WaitForSingleObjectEx@12()
msvcr120d.dll!Concurrency::details::ExternalContextBase::Block() Line 151
msvcr120d.dll!Concurrency::Context::Block() Line 63
msvcr120d.dll!Concurrency::details::_Condition_variable::wait(Concurrency::critical_section & _Lck) Line 595
msvcp120d.dll!do_wait(_Cnd_internal_imp_t * * cond, _Mtx_internal_imp_t * * mtx, const xtime * target) Line 54
msvcp120d.dll!_Cnd_wait(_Cnd_internal_imp_t * * …
Run Code Online (Sandbox Code Playgroud)

c++ visual-c++ msvc12

4
推荐指数
1
解决办法
3186
查看次数

标签 统计

c++ ×2

msvc12 ×1

sleep ×1

visual-c++ ×1

winapi ×1

windows ×1