Tôi đã đạt đến một điểm trong dự án yêu cầu liên lạc giữa các luồng trên tài nguyên rất tốt có thể được ghi vào, vì vậy việc đồng bộ hóa là điều bắt buộc. Tuy nhiên tôi không thực sự hiểu đồng bộ hóa ở bất cứ điều gì khác hơn mức cơ bản.std :: ví dụ lock_guard, giải thích lý do tại sao nó hoạt động
xem xét ví dụ cuối cùng trong liên kết này: http://www.bogotobogo.com/cplusplus/C11/7_C11_Thread_Sharing_Memory.php
#include <iostream>
#include <thread>
#include <list>
#include <algorithm>
#include <mutex>
using namespace std;
// a global variable
std::list<int>myList;
// a global instance of std::mutex to protect global variable
std::mutex myMutex;
void addToList(int max, int interval)
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (int i = 0; i < max; i++) {
if((i % interval) == 0) myList.push_back(i);
}
}
void printList()
{
// the access to this function is mutually exclusive
std::lock_guard<std::mutex> guard(myMutex);
for (auto itr = myList.begin(), end_itr = myList.end(); itr != end_itr; ++itr) {
cout << *itr << ",";
}
}
int main()
{
int max = 100;
std::thread t1(addToList, max, 1);
std::thread t2(addToList, max, 10);
std::thread t3(printList);
t1.join();
t2.join();
t3.join();
return 0;
}
Ví dụ trình bày cách ba chủ đề, hai nhà văn và một người đọc, truy cập một tài nguyên chung (danh sách).
Hai chức năng toàn cầu được sử dụng: một được sử dụng bởi hai luồng của người viết và một được sử dụng bởi chuỗi trình đọc. Cả hai chức năng đều sử dụng một lock_guard để khóa cùng một tài nguyên, danh sách.
Bây giờ ở đây là những gì tôi chỉ không thể quấn đầu của tôi xung quanh: Người đọc sử dụng một khóa trong một phạm vi khác nhau hơn hai chủ đề nhà văn, nhưng vẫn khóa xuống cùng một nguồn tài nguyên. Làm thế nào có thể làm việc này? Sự hiểu biết hạn chế của tôi về mutexes cho chính nó tốt đến chức năng của người viết, ở đó bạn có hai luồng bằng cách sử dụng cùng một hàm chính xác. Tôi có thể hiểu rằng, một kiểm tra được thực hiện ngay khi bạn chuẩn bị bước vào khu vực được bảo vệ, và nếu ai đó đã ở trong đó, bạn chờ đợi.
Nhưng khi phạm vi khác biệt? Điều này sẽ chỉ ra rằng có một số loại cơ chế mạnh hơn chính quy trình đó, một số loại môi trường thời gian chạy ngăn chặn việc thực thi luồng "trễ". Nhưng tôi nghĩ rằng không có những điều như vậy trong c + +. Vì vậy, tôi đang thua lỗ.
Chính xác những gì diễn ra dưới mui xe ở đây?
Tôi muốn thêm rằng khóa mutex là [nguyên tử] (http://stackoverflow.com/questions/15054086/what-does-atomic-mean-in-programming). Hi vọng điêu nay co ich. – Incomputable