Giả sử tôi có các chức năng không trực tuyến của riêng mình LockMutex và UnlockMutex, đang sử dụng một số mutex thích hợp - chẳng hạn như tăng - bên trong. Trình biên dịch sẽ không biết sắp xếp lại các hoạt động khác liên quan đến các cuộc gọi tới LockMutex và UnlockMutex như thế nào? Nó không thể biết làm thế nào tôi sẽ thực hiện các chức năng này trong một số đơn vị biên dịch khác.Trình biên dịch sắp xếp lại xung quanh ranh giới mutex?
void SomeClass::store(int i)
{
LockMutex(_m);
_field = i; // could the compiler move this around?
UnlockMutex(_m);
}
ps: Người ta phải sử dụng các lớp học để giữ khóa để đảm bảo mở khóa. Tôi đã bỏ điều này ra để đơn giản hóa ví dụ.
đúng. Trình biên dịch chuyển động mã sẽ có một mô hình phân tích tĩnh về cách chương trình của bạn hoạt động và các phụ thuộc dữ liệu/hoạt động của nó, và nó sẽ bảo toàn các phụ thuộc đó. –
Nói đúng ra, không có bất kỳ sự phụ thuộc nào giữa biến _field, và lời gọi tới LockMutex hoặc UnlockMutex, vì vậy việc bảo quản phụ thuộc không giúp ích gì ở đây. –