加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

在Windows上创建缓慢的线程

发布时间:2020-12-14 02:05:41 所属栏目:Windows 来源:网络整理
导读:我已经使用C 11工具将一个数字运算应用程序升级为多线程程序.它在Mac OS X上运行良好,但不受益于 Windows上的多线程(Visual Studio 2013).使用以下玩具程序 #include iostream#include threadvoid t1(int k) { k += 1;};void t2(int k) { k += 1;};int main(
我已经使用C 11工具将一个数字运算应用程序升级为多线程程序.它在Mac OS X上运行良好,但不受益于 Windows上的多线程(Visual Studio 2013).使用以下玩具程序

#include <iostream>
#include <thread>

void t1(int& k) {
    k += 1;
};

void t2(int& k) {
    k += 1;
};

int main(int argc,const char *argv[])
{
    int a{ 0 };
    int b{ 0 };

    auto start_time = std::chrono::high_resolution_clock::now();
    for (int i = 0; i < 10000; ++i) {
        std::thread thread1{ t1,std::ref(a) };
        std::thread thread2{ t2,std::ref(b) };
        thread1.join();
        thread2.join();
    }
    auto end_time = std::chrono::high_resolution_clock::now();
    auto time_stack = std::chrono::duration_cast<std::chrono::microseconds>(
        end_time - start_time).count();
    std::cout << "Time: " << time_stack / 10000.0 << " micro seconds" <<
        std::endl;

    std::cout << a << " " << b << std::endl;

    return 0;
}

我发现在Mac OS X上启动一个线程需要34微秒,在Windows上需要340微秒才能完成相同的操作.我在Windows方面做错了吗?这是一个编译问题吗?

解决方法

不是编译器问题(严格来说也不是操作系统问题).

众所周知,创建线程是一项昂贵的操作.在Windows下尤其如此(在克隆之前的Linux下也是如此).
此外,创建和加入一个线程必然很慢,并没有说明如何创建一个线程.加入假定线程已经退出,这只能在计划运行之后发生.因此,您的测量包括调度引入的延迟.在你看来,你衡量的时间实际上相当不错(它们很容易长20倍!).

然而,无论如何,产卵线程是否缓慢并不重要.

在真实程序中创建20,000个基准测试中的线程是一个严重的错误.虽然创建数千(甚至数百万)个线程并非严格违法或不允许,但使用线程的“正确”方法是创建的线程数量不会超过大约CPU核心数量.一个人不会一直创建非常短暂的线程.
您可能有一些短命的线程,并且您可能会创建一些额外的线程(例如阻塞I / O),但您不希望创建数百或数千个线程.每个额外的线程(超出CPU核心数)意味着更多的上下文切换,更多的调度程序工作,更多的缓存压力,1MB的地址空间和每个线程64kB的物理内存(由于堆栈保留和提交粒度).

现在,假设您在程序启动时创建了10个线程,根本不需要花费3毫秒.无论如何,程序启动需要几百毫秒(至少),没有人会注意到差异.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读