簡體   English   中英

使用 -pthread 如何不違反 ODR 規則?

[英]How is using -pthread not violation ODR rules?

我最近通過 CFFI 進行了 Python 擴展/包構建,它使用pthread_atfork (和 pthread 互斥鎖)但不鏈接 pthread,即既不指定-pthread也不指定-lpthread ,因此在具有靜態部分的系統上失敗由於缺少符號,由 libpthread 鏈接腳本(而不是純粹的共享庫)鏈接。

在考慮正確的修復時,我在編譯時偶然發現了-pthread 和 -lpthread 之間差異 因此,在編譯和鏈接步驟中使用-pthread不僅將-lpthread放置在正確的位置(在上述設置中至關重要),而且還定義了更改函數定義的預處理器符號。

(第三方)函數的一個例子是boost::datetime::c_time::localtime(...) ,它調用localtime_rstd::localtime

這不是(很可能)違反 ODR 的來源嗎? 因此,例如,在沒有-pthread情況下編譯一個根本不使用線程的簡單靜態庫,並將其鏈接到一個使用線程的二進制文件中,因此使用-pthread會導致對此類函數的不同定義並且是 UB(/IB?)?

但是從我的/usr/include/features.h我看到

   _REENTRANT, _THREAD_SAFE
      Obsolete; equivalent to _POSIX_C_SOURCE=199506L.

所以問題:

  1. 是否/是否存在由於-pthread導致的 ODR 違規,如果是,為什么(這不是避免/故意/疏忽)?
  2. 這些定義不再相關了嗎? 所以-pthread現在等價於-lpthread (保存位置)?
  3. 應該使用什么來構建 Python 的 CFFI 擴展? 由於依賴於編譯器的命名( -pthread, -pthreads, -mthreads等) -pthread, -pthreads, -mthreads使用-pthread很困難

在 Linux 上,與-lpthread相對的標志-pthread確實只是額外地將標志-D_REENTRANT傳遞給 gcc 選項,現在已經過時了。

另請參閱features.h此評論:

/* Some C libraries once required _REENTRANT and/or _THREAD_SAFE to be
   defined in all multithreaded code.  GNU libc has not required this
   for many years.  We now treat them as compatibility synonyms for
   _POSIX_C_SOURCE=199506L, which is the earliest level of POSIX with
   comprehensive support for multithreaded code.  Using them never
   lowers the selected level of POSIX conformance, only raises it.  */

但是,可能仍然存在 C 標准庫實現,它們依賴於在編譯多線程代碼時定義_REENTRANT 但是,對於 libc(可能在大多數其他環境中),您可以安全地使用-lpthread進行編譯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM