【问题标题】:Is it safe to use hundreds of threads if they're only created once?如果它们只创建一次,那么使用数百个线程是否安全?
【发布时间】:2013-01-16 05:43:15
【问题描述】:

基本上我有一个 Task 和一个 Thread 类,我创建的线程数量等于物理内核(或逻辑内核,因为在 Intel CPU 内核上它们是数量的两倍)。

所以基本上线程从任务列表中获取任务并执行它们。但是,我必须确保一切都是安全的,并且多个线程不要尝试一次执行相同的任务,这当然会引入额外的开销(和头痛)。

我将任务功能放在线程中是什么意思?我的意思是 - 不是 4 个线程从 200 个任务池中抓取任务,为什么不是 200 个线程以 4 x 4 为一组执行,基本上我不需要同步任何东西,没有锁定,没有任何东西。当然我不会在整个运行时创建线程,只是在初始化时。

这种方法有什么优点和缺点?我可以忽略的一个问题是 - 因为我只在初始化时创建线程,所以它们的数量是固定的,而对于任务,我可以继续在任务池中转储更多任务。

【问题讨论】:

标签: c++ multithreading thread-safety threadpool


【解决方案1】:

线程有成本 - 每个线程至少需要空间用于 TLS 和堆栈。

【讨论】:

    【解决方案2】:

    从长远来看,将您的 Task 和 Thread 类分开将是一种更简洁、更易于管理的方法,并且通过允许您限制在任何给定时间创建和运行的线程数(另外,一个 Task 可能比线程占用更少的内存,并且在需要时可以更快地创建和释放)。任务是控制完成的内容。线程控制任务何时运行。是的,您需要将 Task 对象存储在线程安全列表中,但是使用临界区、互斥锁、信号量等非常容易实现。特别是在 Windows 上,您也可以使用 I/O 完成端口代替将任务提交给线程,让操作系统为您处理同步和调度。

    【讨论】:

      【解决方案3】:

      一次运行 200 个线程肯定比运行 4 个线程运行 200 个“任务”需要更长的时间。您可以通过一个简单的程序进行一些简单的数学测试(例如,计算前 20000000 个素数,通过要求每个线程一次做 100000 个数字,然后抓取下一批,或者制作 200 个线程,每个线程有 100000 个数字)。

      慢多少?不知道,取决于很多事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多