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

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

我正在Windows上编写一个多线程程序。由于我所知道的windows下没有支持C11线程的C标准库实现,所以我最好的选择是使用原生的WinAPI多线程。但是有一个问题。C库中的一些函数,如 malloc 或IO函数被C11标准要求是线程安全的。但它们是否被要求是线程安全的,即使是 __STDC_NO_THREADS__ 的定义?如果在C语言实现中不存在线程设施,那么它们的线程安全似乎毫无意义,但这确实会有帮助,因为我真的不想把所有的IO函数都包在mutexes中。

c multithreading c11
1个回答
2
投票

如果你针对微软多线程运行库进行编译和链接,那么像malloc()这样的函数将是线程安全的。

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

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

还有更多。https:/docs.microsoft.comen-uscppparallelmultithreading-with-c-and-win32?view=vs-2019。


0
投票

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

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

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


-1
投票

最明显和可避免的是那些使用并经常返回子程序静态数据元素的函数,当然,尽管名称上下文是本地的,但它是在堆上的。 它们很少见,但我想到了asctime()和它的一些朋友。 https:/linux.die.netman3asctime man页面说过时了,用strftime()。 但是,任何一个展现'状态'的函数,可能里面都有一个静态的! 例如,strtok()。https:/linux.die.netman3strtok() 我一直不喜欢,喜欢用手工解析我的字符串,不修改输入,用指针派生长度。 所以要小心。 一个优秀的C程序员可以写出大部分的库例程,所以可以想象子程序静态(或文件静态全局或全局)被用来给出 "状态 "的地方。

另外,按照严格的定义,函数应该是没有状态的,但是子程序可以! 在C++、JAVA等方法中,方法会把状态保存在对象或类中,为了支持线程,可以在其中一级或两级加入一个mutex,也可以让JAVA方法'同步'!

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