Để thực hiện một khóa miễn phí Mã cho đa luồng ứng dụng tôi đã sử dụng volatile
biến, Về mặt lý thuyết: Từ khoá volatile
chỉ đơn giản được sử dụng để đảm bảo rằng tất cả các chủ đề nhìn thấy giá trị được cập nhật nhất của một biến biến động; do đó, nếu thread A
cập nhật giá trị biến và chuỗi B
đọc biến đó ngay sau khi cập nhật đó xảy ra, nó sẽ thấy giá trị được cập nhật gần đây nhất được viết từ chủ đề A. Khi tôi đọc trong một số C# 4.0 trong Nutshell book đây là sai vìdễ bay hơi và Thread.MemoryBarrier trong C#
áp dụng ổn định không ngăn cản một ghi theo sau là một đọc khỏi bị hoán đổi.
thể vấn đề này được giải quyết bằng cách đặt Thread.MemoryBarrier()
trước mỗi get của biến volatile
như:
private volatile bool _foo = false;
private void A()
{
//…
Thread.MemoryBarrier();
if (_foo)
{
//do somthing
}
}
private void B()
{
//…
_foo = true;
//…
}
Và nếu điều này giải quyết vấn đề; xem xét chúng ta có một vòng lặp while phụ thuộc vào giá trị đó tại một trong các điều kiện của nó; đang đặt Thread.MemoryBarrier()
trước vòng lặp while là một cách chính xác để khắc phục sự cố? ví dụ:
private void A()
{
Thread.MemoryBarrier();
while (_someOtherConditions && _foo)
{
// do somthing.
}
}
Để chính xác hơn, tôi muốn biến số _foo
mang lại giá trị mới nhất khi bất kỳ chuỗi nào yêu cầu bất kỳ lúc nào; vì vậy nếu chèn Thread.MemoryBarrier()
trước khi gọi biến sửa chữa vấn đề sau đó tôi có thể sử dụng Foo
tài sản thay vì _foo
và làm một Thread.MemoryBarrier()
trong get của rằng bất động sản như:
Foo
{
get
{
Thread.MemoryBarrier();
return _foo;
}
set
{
_foo = value;
}
}
Có thể trùng lặp ... http: //stackoverflow.com/questions/1330590/when-to-use-volatile-or-thread-memorybarrier-in-threadsafe-locking-code-c –
@Aron; không có nó không trùng lặp; đây là một câu hỏi khác. –
@Jalal Bạn đang cố gắng giải quyết một vấn đề bằng cách sử dụng phương pháp này dễ bay hơi/memorybarrier hoặc bạn ok với bất kỳ cách tiếp cận nào giải quyết vấn đề của bạn? –