2013-10-29 27 views
5

thực hiện mutex tôi chỉ đơn giản là thử lại trên CAS thất bại (pseudo code):Làm thế nào để thực hiện "backon mũ" trong việc thực hiện mutex đơn giản này?

while(!compare_and_swap(&mutex, 0, 1)); 

Nhưng nó lãng phí quá nhiều chu kỳ CPU.

Tôi đã học được rằng "hoàn trả theo hàm mũ" cải thiện hiệu suất tổng thể. Làm thế nào để thực hiện sự chậm trễ backoff trong C?

  • Có API hẹn giờ chính xác (để thực hiện trễ trễ) không?
  • Hệ điều hành có cung cấp bất kỳ cơ sở nào để triển khai backoff không?

Trả lời

10

Exponential backoff là một thuật toán đơn giản làm giảm tỷ lệ cố gắng nhân trong trường hợp lỗi lặp lại. Có, trong trường hợp nhiều chủ đề liên tục truy cập một biến chia sẻ, chờ đợi một chút trước khi thử lại CAS có thể thường cải thiện hiệu suất tổng thể.

Ý tưởng đơn giản nhất mà bạn nghĩ đến khi triển khai nguyên tắc này là sử dụng giấc ngủ tăng theo cấp số nhân. Ví dụ:

#include <unistd.h> 

// ... 

useconds_t delay = 100000; // Delay in usec 

while(!compare_and_swap(&mutex, 0, 1)) 
{ 
    usleep(delay); 

    if (delay < MAX_DELAY) 
    { 
     delay *= 2; 
    } 
} 

Lưu ý rằng bạn nên hạn chế sự chậm trễ để tránh ngủ "vĩnh cửu". Chọn một giá trị hợp lý cho MAX_DELAY theo ý thích của bạn.

+2

Và đặt lại độ trễ thành giá trị bắt đầu sau khi kết nối thành công. – mpez0

+1

@ mpez0 Tất nhiên. Nhưng tôi muốn reinitialize sự chậm trễ ngay trước khi tôi bắt đầu một thủ tục CAS. –

Các vấn đề liên quan