sleep() 会影响 pthread 执行吗?

Does sleep() affect pthread execution?

我对这个例子感到困惑:

#include <stdio.h> 
#include <unistd.h>
#include <pthread.h> 

void *thread_func() 
{ 
    sleep(1); // removing this changes the result
    printf("\n");
    return NULL;
} 

int main() 
{ 
    int i;

    for (i = 0; i < 10000; i++) 
    {
        pthread_t tid; 
        pthread_create(&tid, NULL, thread_func, NULL); 
    }  

    pthread_exit(NULL); 
    return 0; 
}

如果我 运行 使用 sleep(1),我计算 2047 行,没有它是 10000,正如预期的那样。这是怎么回事?

编辑:将预期行数更正为 10000。

由于您的程序在退出之前不会等待其线程,因此发生的情况是它有一个模糊定义的时间 运行 在退出程序之前会破坏所有线程。

更新:pthread_exit 确实在等待线程。对于 运行ning 的线程。我怀疑正在发生的事情是由 pthread_create 创建的线程在 pthread_exit 之前没有完全构建,然后程序退出。部分线程构造发生在新线程中,因此如果它从未被安排到 运行 那么该线程可能也不存在。

创建 10,000 个线程需要时间。摧毁他们也是如此。与此同时,显然有 3,000 个线程设法到达 printf 语句。

时间长短和打印数量取决于许多不同的因素,因此也可能是随机的。

抛开显示的代码试图创建 10000 个线程,如果创建成功,将打印 10000 行而不是 3000 行,核心问题是:

与不等待相比,如果每个线程等待 1 秒,为什么 print 正在执行的线程更少?

可能的推理:

每个线程都在吃资源。因此,同时存在的最大线程数是有限的。

如果每个线程在结束前等待 1 秒,则可以假设可用资源比线程立即退出时消耗得更快。因此,如果资源耗尽,线程的创建就会失败,代码会忽略它,但会尝试创建下一个线程。

要查看真正发生的事情,代码应该像这样记录创建失败的情况:

#include <stdio.h> 
#include <unistd.h>
#include <pthread.h> 
#include <errno.h>

void *thread_func(void) 
{ 
    sleep(1); /* Removing this probably lowers the number of failed creations. */
    printf("\n");
    return NULL;
} 

int main(void) 
{ 
    int i;

    for (i = 0; i < 10000; i++) 
    {
        pthread_t tid; 
        if (errno = pthread_create(&tid, NULL, thread_func, NULL))
        {
          perror("pthread_create() failed");
        }
    }  

    pthread_exit(NULL); 

    /* Never arriving here. */
    return 0; 
}

以上代码预计打印总行数为10000行,部分为空行至stdout,部分列出创建失败行至stderr