2012-10-10 39 views
10

Số documentation for usleep nói rằng gọi usleep(0) không có hiệu lực. Tuy nhiên, trên hệ thống của tôi (RHEL 5.2) chạy đoạn mã nhỏ của mã C++ bên dưới, tôi thấy rằng nó thực sự dường như có cùng tác dụng như usleep(1). Điều này có được mong đợi không, và nếu có, tại sao có sự khác biệt giữa tài liệu và những gì tôi thấy trong đời thực?Ảnh hưởng của việc ngủ (0) trong C++ trên Linux

lục A Mã

:

#include <unistd.h> 

int main() 
{ 
    for(int i = 0; i < 10000; i++) 
    { 
     usleep(1); 
    } 
} 

Output:

$ time ./test 
real 0m10.124s 
user 0m0.001s 
sys 0m0.000s 

Phụ lục B

Code:

#include <unistd.h> 

int main() 
{ 
    for(int i = 0; i < 10000; i++) 
    { 
     usleep(1); 
     usleep(0); 
    } 
} 

Output:

$ time ./test 
real 0m20.770s 
user 0m0.002s 
sys 0m0.001s 

Trả lời

13

Về mặt kỹ thuật nó sẽ không có hiệu lực. Nhưng bạn phải nhớ rằng giá trị được chuyển được sử dụng như một số tối thiểu và không phải là tuyệt đối, do đó, hệ thống được tự do sử dụng khoảng thời gian nhỏ nhất có thể thay thế.

+0

Trong khi các câu trả lời khác đưa ra các lý do khác tại sao điều này xảy ra, tôi nghĩ câu trả lời này tổng hợp tất cả chúng từ mức cao. – Dunnie

2

tài liệu Đó là trở lại từ năm 1997, không chắc chắn nếu nó áp dụng cho RHEL5 hiện tại, trang hệ thống dev người Redhat tôi cho usleep không chỉ ra rằng một thời gian ngủ từ 0 không có hiệu ứng.

Thông số bạn vượt qua là thời gian tối thiểu để ngủ. Không có gì đảm bảo rằng luồng sẽ thức dậy sau chính xác thời gian được chỉ định. Với các động lực cụ thể của trình lên lịch, nó có thể dẫn đến thời gian trễ lâu hơn dự kiến.

3

Tôi sẽ phải xem xét nguồn để đảm bảo, nhưng tôi đoán là nó không hoàn toàn "không có hiệu lực", nhưng có lẽ vẫn còn ít hơn usleep(1) - vẫn còn phí gọi hàm, có thể đo lường được trong vòng lặp chặt chẽ, ngay cả khi các cuộc gọi thư viện chỉ đơn giản là kiểm tra các đối số của nó và trả về ngay lập tức, tránh quá trình bình thường hơn của thiết lập một bộ đếm thời gian/gọi lại và gọi trình lên lịch.

1

Nó cũng phụ thuộc vào nếu udelay được triển khai như một vòng lặp bận cho thời lượng ngắn.

4

Tôi chỉ muốn chỉ ra về lệnh thời gian được sử dụng tại đây. Bạn nên sử dụng /usr/bin/time thay vì chỉ time lệnh nếu bạn muốn kiểm tra bộ nhớ chương trình, cpu, thời gian stat. Khi bạn gọi thời gian mà không có đường dẫn đầy đủ thì lệnh thời gian tích hợp được gọi. Nhìn vào sự khác biệt.

mà không cần đường dẫn đầy đủ:

# time -v ./a.out 
-bash: -v: command not found 

real 0m0.001s 
user 0m0.000s 
sys  0m0.001s 

với đường dẫn đầy đủ:

# /usr/bin/time -v ./a.out 
Command being timed: "./a.out" 
User time (seconds): 0.00 
System time (seconds): 0.00 
Percent of CPU this job got: 0% 
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:10.87 
Average shared text size (kbytes): 0 
Average unshared data size (kbytes): 0 
Average stack size (kbytes): 0 
Average total size (kbytes): 0 
Maximum resident set size (kbytes): 0 
Average resident set size (kbytes): 0 
Major (requiring I/O) page faults: 0 
Minor (reclaiming a frame) page faults: 220 
Voluntary context switches: 10001 
Involuntary context switches: 1 
Swaps: 0 
File system inputs: 0 
File system outputs: 0 
Socket messages sent: 0 
Socket messages received: 0 
Signals delivered: 0 
Page size (bytes): 4096 
Exit status: 0 

sử dụng man time cho /usr/bin/time bằng tay và sử dụng help time cho xây dựng kịp thời thông tin.

+0

Phiên bản rất hữu ích của thời gian, cảm ơn con trỏ! –

0

Theo kinh nghiệm của tôi, nó có một hiệu ứng: nó gọi là gián đoạn.
Điều này là tốt để giải phóng bộ xử lý trong khoảng thời gian nhỏ nhất trong lập trình đa luồng.

2

usleep()sleep() được dịch sang nanosleep() cuộc gọi hệ thống. Hãy thử strace chương trình của bạn và bạn sẽ thấy nó. Từ nanosleep() manual:

nanosleep() suspends the execution of the calling thread until either 
    at least the time specified in *req has elapsed, or the delivery of a 
    signal that triggers the invocation of a handler in the calling 
    thread or that terminates the process. 

Vì vậy, tôi nghĩ ulseep (0) sẽ tạo ra ngắt và chuyển ngữ cảnh.

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