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