與Is a static boost::wregex instance thread-safe?相關,但適用於標準版本。我可以使用相同的正則表達式對象從幾個線程調用regex_search嗎?是std :: regex線程安全嗎?
回答
聲稱std::regex
在各方面都是線程安全的,這是一個非常大膽的陳述。 C++ 11標準沒有爲正則表達式庫做出這樣的保證。
但是,看看std::regex_search
的原型,表明它需要將basic_regex
對象作爲常量參數。這意味着它受到標準庫的保證,該函數的const修飾符implies thread-safety與該參數相關。
在standardese,那就是:
[17.6.5.9/1] 該節指定實現中應滿足以防止數據爭要求(1.10)。除非另有說明,否則每個標準庫函數都應符合各項要求在下面指定的情況以外的情況下,實現可能會阻止數據競爭。
[17.6.5.9/3] A C++標準庫函數應不直接或間接地修改對象(1.10)比當前線程其他線程訪問,除非對象通過該函數的非直接或間接地訪問-const參數,包括
this
。
所以,在您使用標準庫的實現禁止的錯誤,看來要std::regex_search
調用是線程安全的相對於該傳入的regex
對象。
其他的想法:
只是因爲std::regex_search
是重入相對於它的regex
說法並不意味着你完全露出水面。在線程安全的調用(如std::regex_search
)的同時以非線程安全的方式執行修改regex
的操作仍然是未定義的行爲。 basic_regex
的assignment operator,std::swap和basic_regex::imbue
想到它們對其操作的basic_regex
的非線程安全函數。知道了這一點,對於每個線程閒暇時使用/修改應該以最低的性能成本製作一個regex
對象的副本可能會更好。
儘管Sean's answer對標準來說是正確的,但個別實施可能會失敗。至少,VC++ 2013看起來好像在它的拷貝構造函數中有一個race conditions,並且在一個懶惰的求值變量中。
根據該票,它應該在最近發佈的VS2015中得到修復。 –
- 1. std :: vectors線程安全嗎?
- 2. std :: random_shuffle線程安全嗎?
- 3. std :: condition_variable是線程安全的嗎?
- 4. 是std :: to_string線程安全嗎?
- 5. 是std :: polar線程安全嗎?
- 6. 是從std :: map或std :: set線程安全的複製嗎?
- 7. 是std :: map和std :: set線程安全嗎?
- 8. 是java.sql.Connection線程安全嗎?
- 9. 是CreateChildContainer()線程安全嗎?
- 10. 是Thread.getStackTrace()線程安全嗎?
- 11. 是DocumentBuilder.parse()線程安全嗎?
- 12. 是javax.sql.DataSource線程安全嗎?
- 13. 是TcpClient.Available線程安全嗎?
- 14. 是sqlite.swift線程安全嗎?
- 15. 是winsock2線程安全嗎?
- 16. 是unique_ptr線程安全嗎?
- 17. 是SplittableRandom.split()線程安全嗎?
- 18. 線程安全(是嗎?)
- 19. 是IP2Location線程安全嗎?
- 20. 是System.DirectoryServices.AccountManagement.GroupPrincipal線程安全嗎?
- 21. 是Microsoft.Practices.EnterpriseLibrary.Data.Database.SetParameterValue線程安全嗎?
- 22. 是java.util.UUID線程安全嗎?
- 23. 是enumerateUsingBlock:線程安全嗎?
- 24. 是java.util.concurrent.Future線程安全嗎?
- 25. 是DatagramSocket.send線程安全嗎?
- 26. 是長線程安全嗎?
- 27. 是SpelExpression線程安全嗎?
- 28. 是UImage.AsPNG()線程安全嗎?
- 29. 是ArrayDescriptor線程安全嗎?
- 30. java線程安全:線程安全嗎?
'std :: regex'實例代表一個已編譯的正則表達式,*意味着*被重用,因爲正則表達式編譯是一個代價高昂的過程。當然,當其他線程已經在使用它時,交換/重新分配一個已存在的實例(無論是'std :: regex'還是其他任何東西)都是愚蠢的。 – rustyx