Tôi có một câu hỏi khá cụ thể về lập trình đồng thời trong C. Tôi đã thực hiện một chút công bằng về nghiên cứu này nhưng đã thấy một số câu trả lời mâu thuẫn, vì vậy tôi hy vọng cho một số làm rõ. Tôi có một chương trình đó là một cái gì đó như sau (xin lỗi vì khối mã hơi dài):truy cập biến đồng thời trong c
typedef struct {
pthread_mutex_t mutex;
/* some shared data */
int eventCounter;
} SharedData;
SharedData globalSharedData;
typedef struct {
/* details unimportant */
} NewData;
void newData(NewData data) {
int localCopyOfCounter;
if (/* information contained in new data triggers an
event */) {
pthread_mutex_lock(&globalSharedData.mutex);
localCopyOfCounter = ++globalSharedData.eventCounter;
pthread_mutex_unlock(&globalSharedData.mutex);
}
else {
return;
}
/* Perform long running computation. */
if (localCopyOfCounter != globalSharedData.eventCounter) {
/* A new event has happened, old information is stale and
the current computation can be aborted. */
return;
}
/* Perform another long running computation whose results
depend on the previous one. */
if (localCopyOfCounter != globalSharedData.eventCounter) {
/* Another check for new event that causes information
to be stale. */
return;
}
/* Final stage of computation whose results depend on two
previous stages. */
}
Có một thread pool phục vụ kết nối dữ liệu đến, vì vậy nhiều trường hợp của newData có thể chạy cùng một lúc . Trong môi trường đa bộ xử lý có hai vấn đề mà tôi nhận thấy trong việc xử lý bộ phận xử lý truy cập của mã này chính xác: ngăn trình biên dịch lưu vào bộ nhớ cache bản sao được chia sẻ trong sổ đăng ký để các chủ đề khác không thể nhìn thấy và buộc CPU để ghi lưu trữ giá trị bộ đếm vào bộ nhớ một cách kịp thời để các luồng khác có thể nhìn thấy nó. Tôi không muốn sử dụng một cuộc gọi đồng bộ xung quanh kiểm tra bộ đếm vì một phần đọc của giá trị bộ đếm được chấp nhận (nó sẽ tạo ra một giá trị khác với bản sao cục bộ, đủ để kết luận rằng một sự kiện đã xảy ra). Nó sẽ là đủ để khai báo các lĩnh vực eventCounter trong SharedData là dễ bay hơi, hoặc tôi cần phải làm cái gì khác ở đây? Ngoài ra là có một cách tốt hơn để xử lý này?
Bạn hoàn toàn chính xác về bản sao cục bộ, tôi vừa sửa lỗi đó trong văn bản của mình. – user98166