Cho phép nói rằng tôi có một con trỏ đến một số nguyên.Con trỏ dereferencing có phải là nguyên tử không?
volatile int* commonPointer = new int();
Và tôi có nhiều chủ đề mà dereference con trỏ đó.
int blah = *commonPointer;
Nhưng, một thread cần phải thay đổi địa chỉ của con trỏ rằng:
int* temp = new int();
int* old = commonPointer;
InterlockedExchange(&commonPointer,temp);
delete old;
Bây giờ, cho phép bỏ qua một thực tế rằng một số chủ đề chưa đọc giá trị "cũ", và một số có thể được đọc " mới "giá trị, đó không phải là một vấn đề trong trường hợp của tôi.
Có thể có trường hợp trong đó một chuỗi bắt đầu bỏ qua con trỏ, giống như địa chỉ bị xóa và sau đó bị ngoại lệ?
Hoặc là cuộc hội thảo dicferencing đủ để không xảy ra?
"nguyên tử * đủ *"? Việc đọc một số nguyên 32 bit không được đảm bảo là nguyên tử theo tiêu chuẩn, được xác định bởi nền tảng của bạn. Trong thực tế nó thường sẽ được, nhưng bạn luôn có thể kiểm tra rằng chính mình. –
Kiến trúc hệ điều hành và CPU là gì? –
@EdS. Đọc một số nguyên 32 bit là nguyên tử. Nhưng dereferencing con trỏ ... Tôi không chắc chắn như vậy. Nó nhiều hơn một lần đọc .. nó đọc địa chỉ 32-bit (hoặc 64 in x64) của con trỏ, và sau đó cần thực hiện một thao tác đọc khác từ địa chỉ đó. –