Có một tính năng thử nghiệm mới (có thể là C++ 20), là "khối được đồng bộ hóa". Khối cung cấp khóa toàn cầu trên một phần mã. Sau đây là ví dụ từ cppreference.Tính năng mới, khối "đồng bộ" nào trong C++ cung cấp?
#include <iostream>
#include <vector>
#include <thread>
int f()
{
static int i = 0;
synchronized {
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
}
int main()
{
std::vector<std::thread> v(10);
for(auto& t: v)
t = std::thread([]{ for(int n = 0; n < 10; ++n) f(); });
for(auto& t: v)
t.join();
}
Tôi cảm thấy nó không cần thiết. Có sự khác biệt giữa một khối đồng bộ từ trên cao, và điều này:
std::mutex m;
int f()
{
static int i = 0;
std::lock_guard<std::mutex> lg(m);
std::cout << i << " -> ";
++i;
std::cout << i << '\n';
return i;
}
Ưu điểm duy nhất tôi tìm thấy ở đây là tôi đang lưu những rắc rối của việc có một khóa toàn cầu. Có nhiều ưu điểm hơn khi sử dụng khối được đồng bộ hóa không? Khi nào nó nên được ưa thích?
Không chắc chắn nếu điều này thực sự là trường hợp nhưng cppreference làm cho nó âm thanh như phiên bản đầu tiên được đảm bảo để in theo thứ tự trong ví dụ đầu tiên trong khi AFAIK phiên bản thứ hai thì không. – NathanOliver
@NathanOliver Tại sao phiên bản đầu tiên không in theo thứ tự? Bạn có thể giải thích? Theo như tôi đã hiểu, toàn bộ mã sẽ chỉ được thực hiện một lần tại một thời điểm, bao gồm cả in ấn, điều này sẽ làm mọi thứ theo thứ tự. Đây cũng là trường hợp của mutex. –
"Mặc dù các khối đồng bộ thực thi như-if dưới khóa toàn cục, các triển khai được dự kiến sẽ kiểm tra mã trong mỗi khối và sử dụng đồng thời lạc quan (được hỗ trợ bởi bộ nhớ giao dịch phần cứng nếu có) cho mã an toàn giao dịch và khóa tối thiểu cho không mã an toàn giao dịch. " – cpplearner