none
C++11 新特性线程库std::thread的问题 RRS feed

  • 问题

  • 我用std::thread创建一个线程之后,加上主线程,应该是总共2个线程才对,但实际上进程一个有3个线程,在VS下调试的时候显示的是3个线程,WINDOWS资源监视器也显示3个线程。用std::thread创建10个线程之后,加上主线程,应该是总共11个线程才对,但实际上进程一个有17个线程
    不知道这是windows的坑还是STD库的坑,反正我用windows原生的API创建线程是不会出现这个问题的。

    static const int MAX_THREAD_COUNT = 10;

    inline void foo (std::thread* ppThread[MAX_THREAD_COUNT], int nIndex)
    {
        //static int nCount = 0;
        //printf ("Index:%d    Count:%d    ThreadID:%d\n", nIndex, ++nCount, std::this_thread::get_id());
        while (true)
        {
            std::this_thread::sleep_for (std::chrono::milliseconds (100));
        }

        return;
    }

    inline void t7()
    {
        char buf[MAX_PATH] = "";
        std::thread* thr[MAX_THREAD_COUNT] = {nullptr};

        std::cout << "start.\n";
        for (int i = 0; i < MAX_THREAD_COUNT; ++i)
        {
            thr[i] = new std::thread (foo, thr, i);
        }
        std::cout << "started.\n";

        printf ("输入“quit”退出程序\n");
        while (_stricmp (fgets (buf, MAX_PATH, stdin), "quit\n") != 0)
        {
            printf ("输入“quit”退出程序\n");
        }

        std::cout << "stop.\n";
        for each (std::thread*& pThread in thr)
        {
            pThread->join();
            delete pThread;
        }
        std::cout << "stoped.\n";

        return ;
    }

    另外刚刚在linux下测试了下,发现LINUX下不会有这样的问题。

    后来发现这是VS2013对线程的实现机制,不知算不算是bug,换成VS2015之后这个问题就没有了。
    2015年5月13日 10:17

答案

  • 点调试查看各线程的堆栈,看看多出来的线程是哪里的:

    http://bbs.csdn.net/topics/390699719?page=1


    We are trying to better understand customer views on social support experience, so your participation in this interview project would be greatly appreciated if you have time. Thanks for helping make community forums a great place.
    Click HERE to participate the survey.

    • 已标记为答案 Shu 2017 2015年6月10日 2:24
    2015年5月14日 7:47

全部回复