multithreading - Mac 允许的最大线程数

标签 multithreading macos

在报告错误之前,macOS 允许的最大线程数是多少?我找不到一个简单的答案。我相信是 125,但是我怎样才能找到这个呢?感谢您的帮助

最佳答案

正如我的评论中所述,这显然取决于 macOS 版本。

我不知道确切的限制,但 macOS 肯定会支持每个进程超过 125 个线程。

你可以很容易地测试它:

#import <Foundation/Foundation.h>

static NSLock * lock;

int main( void )
{
    @autoreleasepool
    {
        lock = [ NSLock new ];

        for( int i = 0; i < 10000; i++ )
        {
            [ NSThread detachNewThreadWithBlock: ^( void )
                {
                    [ lock lock ];

                    NSLog( @"Thread %i", i );

                    [ lock unlock ];

                    while( 1 )
                    {
                        [ NSThread sleepForTimeInterval: 1 ];
                    }
                }
            ];
        }

        while( 1 )
        {
            [ NSThread sleepForTimeInterval: 1 ];
        }
    }

    return 0;
}

在运行 macOS 10.14 的 MacBookPro 2018 上,我可以生成超过 8000 个线程。

真实号码是8188
由于有一个主线程,加上 3 个专用于调度队列的线程,我们可以假设限制是 8192,这是完全有道理的。

但是,这可能取决于硬件、CPU/内核的数量。

顺便说一句,如果您担心最大线程数,那么您不应该使用线程。

相反,请使用 dispatch queues provided by Grand Central Dispatch (CGD) :

dispatch_async
(
    dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 ),
    ^( void )
    {
        /* ... */
    }
);

您显然可以创建自己的串行或并发队列:

dispatch_queue_create( "MyQueue", DISPATCH_QUEUE_CONCURRENT );

在并发调度队列上,这将使 macOS 管理可用资源,并在可以时生成新线程。

这就是您应该使用并发的方式。尝试忘记线程,直接开始使用 GCD。

关于multithreading - Mac 允许的最大线程数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52861928/

相关文章:

c# - 生产者消费者模式如何通知完成?

android - 具有 singleInstance launchMode 和新线程的 Activity

ios - NSManagedObject 的 hasChanges 为真而 changedValues 为空

macos - 如何为加密图像添加缩略图?

Java工具Notarize流程

python - python中有两个或多个工作队列

java - 循环 Futures - 你应该先检查 isDone 吗?

java - 多线程和 JDBC

macos - 使用 “elasticsearch”命令在任何目录的终端中运行elasticsearch

ios - MacOS 外接显示器插入时如何收到通知