2014-08-28 70 views
-1

我爲大型本地C庫的客戶構建了一個C++ cli包裝器。然後我被要求讓它變得可實例化,並且我不會以OOP方式重寫整個事物,所以我所做的就是擺脫所有全局變量以及任何會干擾通過庫和dll運行的多個線程的任何事情事情的一面,我實現了與靜態庫的所有通信的跟蹤跟蹤(因爲它嚴格同步)。從外面看,它看起來好像是OO。儘管如此,我覺得有點骯髒,可能有更好的解決方案嗎?跟蹤線程ID - 髒修復?

+2

未被設計爲線程安全的代碼可能會被重寫爲安全的可能性極低。無論如何,它與擺脫全局變量無關。爲使用全局變量的C庫創建一個OOP包裝很困難,一次只能解決一個問題。 – 2014-08-28 12:00:31

回答

1

她有兩個問題:instancability和線程安全。

使庫實例化的標準技巧是將所有全局變量放入結構中。然後您需要提供屬於特定實例的結構。 最簡單的方法(它不是線程安全的,順便說一句)是有一個全局結構指針,可以用來指向結構的當前實例。爲了使線程安全,你需要在每個函數調用中傳遞一個結構指針(有點乏味)。

爲了使其線程安全,您還需要重新編寫使用庫調用(C庫和第三方庫)或非線程安全的系統調用的所有代碼。可以用線程安全代碼替換這些調用,也可以用鎖來包圍它們(例如使用信號量)。