Tôi đang tìm hiểu về khóa mutex trong C++, nhưng tôi gặp vấn đề với đoạn mã sau (lấy từ "Thư viện chuẩn C++" của N. Josuttis).
Tôi không hiểu tại sao nó chặn/némTrừ khi tôi thêm vào chủ đề chínhthis_thread::sleep_for
(Sau đó, nó không chặn và cả ba cuộc gọi đều được thực hiện).
Trình biên dịch là cl.exe được sử dụng từ dòng lệnh.
#include
#bao gồm
#include
#include
#include
#include
std::mutex printMutex;
void print(const std::string& s)
{
std::lock_guard lg(printMutex);
cho (char c :s)
{
std::cout.put(c);
}
std::cout << std::endl;
}
int main()
{
auto f1 = std::async(std::launch::async, print, "Xin chào từ chuỗi 1");
auto f2 = std::async(std::launch::async, print, "Xin chào từ chuỗi 2");
// std::this_thread::sleep_for(std::chrono::seconds(1));
print(std::string("Xin chào từ main"));
}
Tôi nghĩ những gì bạn đang thấy là async
(Kết hợp tương lai
) vấn đề nhất quán trong việc triển khai MSVC. Tôi tin là như vậykhông phù hợp .Tôi có thể tái tạo nó bằng VS2013 nhưng không thể tái tạo vấn đề bằng gcc.
Sự cố xảy ra do luồng chính thoát ra (và bắt đầu dọn dẹp) trước khi hai luồng còn lại kết thúc.
Do đó, một sự chậm trễ đơn giản đối với hai hợp đồng tương lai (ngủ_cho
)hoặc .lấy()
hoặc .Chờ đợi()
Nên sửa nó cho bạn. Vì vậy đã sửa đổi chủ yếu
Nó có thể trông giống như;
int main()
{
auto f1 = std::async(std::launch::async, print, "Xin chào từ chuỗi 1");
auto f2 = std::async(std::launch::async, print, "Xin chào từ chuỗi 2");
print(std::string("Xin chào từ main"));
f1.get();
f2.get();
}
Hỗ trợ chờ đợi rõ ràng hoặc khắc phục "ngủ" theo thời gian.
Tuyên bố nhất quán
Có từ nước ép thảo mộc Các thay đổi đề xuất đang chờ xử lý hoặc bị chặn khỏi async
返回的 tương lai
trạng thái được chia sẻ. Đây có thể là nguyên nhân dẫn đến hành vi của MSVC, có thể coi là đã thực hiện đề xuất này. Tôi không chắc kết quả cuối cùng của đề xuất này sẽ ra sao hoặc việc tích hợp nó với C++14 (hoặc các phần của nó) sẽ ra sao. Ít nhất wrt ngăn chặn async
返回的 tương lai
Có vẻ như hành vi MSVC không có trong đặc tả.
Điều thú vị là cách diễn đạt đã thay đổi trong §30.6.8/5;
từ C++ 11
lệnh gọi hàm chờ trên một đối tượng trả về không đồng bộ chia sẻ trạng thái chia sẻ được tạo bởi đối tượng này async
cuộc gọi sẽ chặn cho đến khi chuỗi liên kết hoàn thành, như thể đã tham gia
sang C++14
lệnh gọi hàm chờ trên một đối tượng trả về không đồng bộ chia sẻ trạng thái chia sẻ được tạo bởi đối tượng này async
cuộc gọi sẽ chặn cho đến khi chuỗi liên kết hoàn thành, như thể đã tham gia, nếu không thì hết giờ
Tôi không chắc chắn cách chỉ định "thời gian chờ", tôi đoán đó là việc triển khai được xác định.
Tôi là một lập trình viên xuất sắc, rất giỏi!