繁体   English   中英

在没有 C11 线程的情况下,C 标准库函数是否是线程安全的?

[英]Are C standard library functions thread-safe in absence of C11 threads?

我正在 Windows 上编写一个多线程程序。 由于我知道没有支持 C11 线程的 C 的 windows 实现,因此我最好的选择是使用本机 WinAPI 多线程。 但是有一个问题! C11 标准要求 C 库中的某些函数,例如malloc或 I/O 函数是线程安全的。 但是,即使定义__STDC_NO_THREADS__ ,它们是否也必须是线程安全的? 如果 C 实现中不存在线程设施,那么它们是线程安全的似乎毫无意义,但它确实会有所帮助,因为我真的不想将所有 I/O 函数包装在互斥体中。

如果您针对 Microsoft 多线程运行时库进行编译和链接,则诸如 malloc() 之类的函数将是线程安全的。

这不是语言保证,但由平台保证。

哦, 仔细阅读 MSDN 在 C 或 C++ 中使用线程,您需要使用_beginthread()_beginthreadex() ,而不是 Win32 CreateThread

还有更多: https://docs.microsoft.com/en-us/cpp/parallel/multithreading-with-c-and-win32?view=vs-2019

不,标准库函数不能保证是线程安全的,无论使用什么线程库。 C11 7.1.4/4 明确指出:

标准库中的函数不保证是可重入的,并且可能会修改具有 static 或线程存储持续时间的对象。

特定的标准库实现或库标准扩展可以根据具体情况提供线程安全功能。

即使在 C11 中,标准中的原子性或线程安全保证也仅对由标准定义的方法创建的信号或线程有意义。 如果一个线程是通过标准未指定的某种方式创建的,那么该线程可能做的任何事情,包括它与其他线程的可能交互,都将超出标准的管辖范围。

用于在可以创建线程或触发异步信号的系统上进行低级编程的质量实现通常允许程序以超出标准要求的方式与此类事物进行交互,因为标准基本上什么都不提供。

最明显和可避免的是那些使用并经常返回子例程 static 数据元素的函数,即使名称上下文是本地的,它当然在堆上。 它们很少见,但我想到了 asctime() 和它的一些朋友。 https://linux.die.net/man/3/asctime手册页说已过时,请使用 strftime()。 However, any function that exhibits 'state' probably has a static inside, For instance: strtok(): https://linux.die.net/man/3/strtok I never liked it, preferring to parse my strings by hand and不修改输入,使用指针派生长度。 所以要小心。 一个好的 C 程序员可以编写大部分这些库例程,因此可以想象子例程 static(或文件 static 全局或全局)用于给出“状态”的位置。

顺便说一句,按照严格的定义,函数应该没有 state,但子程序可以,在 C++、JAVA 中。 etc, methods keep their state in their object or class, and for thread support can include a mutex at either or both levels, or you can make JAVA methods 'synchronized'!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM