正如我在评论中所述,这显然取决于 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/核心的数量。
顺便说一句,如果您担心最大线程数,那么您不应该使用线程。
相反,使用Grand Central Dispatch (CGD) 提供的调度队列 https://developer.apple.com/documentation/dispatch?language=objc:
dispatch_async
(
dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_HIGH, 0 ),
^( void )
{
/* ... */
}
);
显然,您可以创建自己的串行或并发队列:
dispatch_queue_create( "MyQueue", DISPATCH_QUEUE_CONCURRENT );
在并发调度队列上,这将使 macOS 管理可用资源,并在可以时生成新线程。
这就是您应该使用并发的方式。尝试忘记线程,直接开始使用 GCD。