2013-07-07 19 views
13

Có thể sử dụng đối tượng std::regex trong nhiều chủ đề sử dụng std::sregex_iterator, std::regex_match, v.v. không?Đồng thời sử dụng std :: regex, hành vi được xác định?

Ví dụ, sẽ là sản phẩm vi logic sau:

bool SomeFunc(const std::string& szString1, const std::string& szString2) 
{ 
    static const std::regex regexTest("=== ([\\w]+) ===", std::regex_constants::optimize); 

    std::future<bool> f = std::async([](std::string szString) { 
     return std::regex_match(szString, regexTest); 
    }, szString1); 

    bool b = std::regex_match(szString2, regexTest); 

    return (b && f.get()); 
} 

tôi không thể tìm thấy bất cứ điều gì trong đó nêu dù sử dụng một const std::regex đồng thời dẫn đến hành vi undefined hay không. Theo như tôi có thể nói, không có chỉnh sửa đang được thực hiện cho đối tượng regex vì vậy không có hành vi không xác định nên được gây ra bằng cách sử dụng nó đồng thời?

Cảm ơn trước!

Trả lời

19

Có, một const std::regex là an toàn chỉ. Trên thực tế, bất kỳ phương pháp const nào trong thư viện chuẩn đều an toàn chỉ, xem:

§17.6.5.9/3. Hàm thư viện chuẩn C++ không trực tiếp hoặc gián tiếp sửa đổi các đối tượng (1.10) có thể truy cập bởi các chủ đề khác với chuỗi trừ khi các đối tượng được truy cập trực tiếp hoặc gián tiếp thông qua các đối số phi const của hàm, kể cả điều này.

+0

Cảm ơn bạn, đó là những gì tôi đã tìm; Tôi chỉ muốn xác nhận. –

+0

@ronag Bạn có thể giải thích câu trả lời của bạn tại sao họ chọn cho đặc tả này không? Ngoài ra làm thế nào điều này đạt được với một lớp học mà không phải là một phần của thư viện chuẩn C++? Tôi hy vọng bạn sẽ tìm thấy thời gian để trả lời những câu hỏi đó! :) – Tim

+0

@Tim "_Also làm thế nào điều này đạt được với một lớp học mà không phải là một phần của thư viện chuẩn C++? _" Tôi không hiểu câu hỏi của bạn ... – curiousguy

Các vấn đề liên quan