gpt4 book ai didi

c - 线程创建过程中程序执行的流程

转载 作者:太空狗 更新时间:2023-10-29 17:03:37 24 4
gpt4 key购买 nike

我是线程的新手。

我已经编写了一个创建线程的示例程序。

#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
#include<string.h>
#include<pthread.h>


void * func(void * temp)
{
printf("inside function\n");
return NULL;
}

int main()
{
pthread_t pt1;
printf("creating thread\n");
pthread_create(&pt1,NULL,&func,NULL);
printf("inside main created thread\n");

return 0;
}

编译后发现答案是:

creating thread
inside main created thread
inside function
inside function

我知道答案可能会有所不同,因为 return 0; 可能会在执行 func 中的 printf 之前被调用。但是在解决方案中,inside function 怎么打印了两次?

关于使用 gcc -o temp thread1.c -lpthread 编译第一次运行时:

creating thread
inside main created thread

第二次运行:

creating thread
inside main created thread
inside function
inside function

关于使用 gcc -pthread -o temp thread1.c 编译第一次运行时:

creating thread
inside main created thread
inside function
inside function

我观察到这种行为

gcc version: 4.4.3 (Ubuntu 4.4.3-4ubuntu5)
Kernel release:2.6.32-24-generic
glib version:2.11.1

最佳答案

我在 gcc 4.6.3 版(Ubuntu/Linaro 4.6.3-1ubuntu5)、glib 2.15 版 上发现了这个问题,带有 O2旗帜。如果没有任何优化标志,则不会观察到此问题。

为什么输出很奇怪
C 语言规范不引用任何特定的编译器、操作系统或 CPU。它引用了一个抽象机器,它是实际系统的概括。这个抽象机(至少达到 C99 规范)是单线程的。所以默认情况下标准库(包括 printf )不需要线程安全。如果您跨线程使用标准库函数(使用一些库,例如 posix libpthread),您有责任在访问非进入标准库函数之前添加同步(互斥量、信号量、condvar 等)。如果不这样做,可能会不时出现令人惊讶的结果,您应自行承担使用风险。

我可以重现此问题的环境的一些分析
分析为两个版本的标志生成的程序集,我找不到任何显着差异(值得注意的是,printf s 被转换为 puts )

查看 puts 的来源

int
_IO_puts (str)
const char *str;
{
int result = EOF;
_IO_size_t len = strlen (str);
_IO_acquire_lock (_IO_stdout);

if ((_IO_vtable_offset (_IO_stdout) != 0
|| _IO_fwide (_IO_stdout, -1) == -1)
&& _IO_sputn (_IO_stdout, str, len) == len
&& _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
result = MIN (INT_MAX, len + 1);

_IO_release_lock (_IO_stdout);
return result;
}

#ifdef weak_alias
weak_alias (_IO_puts, puts)
#endif

看来问题出在_IO_putc_unlocked('\n', _IO_stdout) .这可能会刷新流并可能在更新流状态之前被杀死。

学习多线程编码
当主线程返回时,它终止了整个进程。这包括所有其他线程。因此,向所有子线程发出退出信号(或使用 pthread_kill )并使用 pthread_exit 使主线程退出。或使用 pthread_join .

关于c - 线程创建过程中程序执行的流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25117940/

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