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

问题描述 投票:3回答:3

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

c multithreading winapi c11
3个回答
2
投票

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

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

哦,并且是read MSDN carefully。使用C或C ++中的线程,您需要使用beginthread,而不是Win32 CreateThread

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


0
投票

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

不能保证标准库中的函数是可重入的,并且可以在静态或线程存储期间修改对象。

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


-1
投票

最明显和可避免的是那些使用并经常返回子例程静态数据元素的函数,这些函数当然在堆上,即使名称上下文是本地的。它们很少见,但是想到了asctime()及其一些朋友。 https://linux.die.net/man/3/asctime手册页说已过时,请使用strftime()。但是,任何表现“状态”的函数都可能具有静态内部!例如,strtok():https://linux.die.net/man/3/strtok我从不喜欢它,更喜欢使用指针派生的长度来手工解析我的字符串,而不修改输入。所以要当心。一个好的C程序员可以编写大多数此类库例程,因此可以想象在哪里子例程静态(或文件静态全局或全局)用于给出“状态”。

BTW,严格来说,函数应该没有状态,但是子例程可以!在C ++,JAVA等中,方法将其状态保留在其对象或类中,并且对于线程支持,可以在一个或两个级别上包含互斥量,或者可以使JAVA方法“同步”!

© www.soinside.com 2019 - 2024. All rights reserved.