gpt4 book ai didi

C多线程程序行为解释

转载 作者:太空宇宙 更新时间:2023-11-04 01:03:58 25 4
gpt4 key购买 nike

int g_ant = 0;
void *writeloop(void *arg)
{
while(g_ant < 10)
{
g_ant++;
usleep(rand()%10);
printf("%d\n", g_ant);
}
exit(0);
}

int main(void)
{
pthread_t time;
pthread_create(&time, NULL, writeloop, NULL);
writeloop(NULL);
pthread_join(time, NUL);
return 0;
}

嗨!我有四个问题,我认为它们属于竞争条件类别......? :-)

  1. 我想弄清楚为什么 g_ant 的 printf 在我的计算机上从 2 开始并在 90% 的情况下持续到 10,偶尔输出 1、3->10。我的猜测是因为 usleep 可能会阻碍 thread1 足够长的时间让 thread2 在 thread1 到达 printf 之前递增和 printf。
  2. 这不会弄乱 2->10 的数字吗?
  3. 我也在努力理解 pthread_join 在这个程序中的功能。我的理解是,它是用来等待一个线程完成的。是在等待pthread_create启动的writeloop函数吗?
  4. writelop(null) 是否被视为第二个线程?

最佳答案

  1. g_ant++;不是原子操作,这可能导致未定义的行为。你应该使用
    pthread_mutex_lock(&mutex);pthread_mutex_unlock(&mutex);90%的时间从2开始的原因是因为线程time进入函数,递增g_ant然后自己休眠。操作系统倾向于将它从 CPU 中取出并放置另一个未 sleep 的线程,在您的情况下是您的主线程,它再次将它增加 1 运行 usleep。现在 g_ant 的值为 2,线程 time 恢复并打印 2 并将其递增到 3。主线程恢复并打印 3 并再次递增它,这一直在切换,这就是为什么你看到数字从 2 ->大多数时候是 10。

希望它足够清楚并且也应该回答 2. 问题。

  1. pthread_join 确保其他线程在您的主线程退出程序之前完成它们的工作。

  2. 不,它不被认为是第二个线程,它在主线程上运行函数。

    希望对您有所帮助。

关于C多线程程序行为解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28399402/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com