如何解决sleep() 是否影响 pthread 执行?
我对这个例子感到困惑:
#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。
解决方法
由于您的程序在退出之前不会等待其线程,因此发生的情况是它有一个模糊定义的运行时间,然后退出程序会破坏所有线程。
更新:status_login = False
use_atm = "y"
data =[{"norek":932012042,"pin":123,"name":"grizly","bank":"BCA","balance":5000000},{"norek":932012052,"pin":1234,"name":"Basuki Pepeh","bank":"BRI","balance":4000000},{"norek":932012099,"pin":1235,"name":"Bambang Gentolet","bank":"Mandiri","balance":3500000}]
def cek_login(p):
print(int(p))
print(data[0]['pin'])
if data[0]['pin'] == int(p):
return True
return False
while use_atm == "y":
while status_login == False:
print("Welcome to ATM")
print("insert your pin")
pin = input("PIN : ")
if cek_login(pin) != False:
print("welcome "+ data[0]['name'])
status_login = True
use_atm = "n"
else:
print("")
print("Ops Your PIN is wrong")
print("")
print("")
确实在等待线程。对于正在运行的线程。我怀疑正在发生的是 pthread_exit
创建的线程在 pthread_create
之前没有完全构造,然后程序退出。部分线程构建发生在新线程中,因此如果它从未被安排运行,那么该线程也可能不存在。
创建 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
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。