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
。
我对这个例子感到困惑:
#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
。