我在Linux上創建了一個C庫,它有幾個功能,它們共同操作一些全局數據。爲了使這些函數成爲線程安全的,他們必須在代碼中的適當位置使用互斥鎖。如何創建僅在pthread鏈接時才使用互斥鎖的庫?
在Linux中,爲了在應用程序中使用pthreads,需要鏈接到相應的庫中,即-lpthread。在我的庫被編譯的情況下,如果它的用戶決定在他們的應用程序中使用pthread,並且他們不這樣做,我想讓它工作。
在開發人員在其應用程序中不使用線程的情況下,它們將不會鏈接到pthread。因此,我希望我編譯的庫不要求它,此外,在單線程應用程序中使用互斥鎖使用不必要的開銷(更不用說是愚蠢的)。
是否有某種方式來編寫代碼(如果需要,使用GCC擴展)只有某些符號鏈接到某個代碼塊纔會運行?我知道我可以使用dlopen()和朋友,但這本身需要一些我試圖避免的。我想我所尋找的東西必須存在,因爲幾個標準函數在同一條船上,並且需要互斥體是線程安全的(而且它們是),但是即使不與pthread鏈接,也可以工作。
在這一點上,我注意到,FreeBSD's popen() function上線66 & 67採用非便攜式檢查 - isthreaded,以確定是否有使用或不使用線程,以及是否使用互斥。我懷疑任何這樣的東西都是以任何方式標準化的。但更重要的是,如果符號不被識別,這種代碼就無法編譯和鏈接,在Linux中,如果pthread未鏈接,互斥符號甚至不會出現。總結:在Linux上,如何創建一個庫,它知道何時使用線程,如果是,在適當的情況下使用互斥鎖,並且不需要鏈接到pthread,除非應用程序開發人員特別想使用線程在某處?
「在開發人員在應用程序中不使用線程的情況下,它們不會與pthreads鏈接。」 - 但你的圖書館*將*。或者如果它是靜態庫,它將包含大量必須由調用程序解決的外部pthread引用,即使它們不使用pthread。如果沒有一對pthread/no-pthread共享對象模塊,我不認爲你會得到你想要的東西,正確的一個dyna-在運行時加載*由你根據調用者的初始化配置加載,所有在非線程配置中的鎖定操作。 – WhozCraig
你可以隨時踢,順便說一句,並讓應用程序提供一組鎖*爲你*。例如,RSA BSAFE CryptoC-ME通過要求應用程序提供一個回調函數,該函數忠實地使用它自己的「鎖定表」,其大小爲由庫標題指定的預定義的「#define」大小,然而許多「鎖「是必要的。每個鎖操作都通過索引傳遞給回調函數,其中一個var聲明操作請求是(LOCK,UNLOCK)。然後,應用程序可以知道它是單線程的,只需提供一個回調,該回調總是返回true,而不會執行其他任何操作。 – WhozCraig