簡體   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