2010-01-02 26 views
14

Tìm thấy trong torvalds/linux-2.6.git -> kernel/mutex.c line 171Loại vòng lặp nào dành cho (;;)?

Tôi đã cố gắng tìm nó trên Google và như vậy không có kết quả.

Điều gì for (;;) hướng dẫn?

+32

không phải là nhận xét hữu ích. Chỉ vì konman không phải là thạo trong C không có nghĩa là họ không thể đọc các tập tin mã. Và bây giờ họ đã học được điều gì đó, vì vậy đó là một điều tốt. –

+10

Tôi đồng ý với Alastair. Đọc nguồn được viết bởi những người khác là một cách tuyệt vời để tìm hiểu. – CesarGon

+20

Nếu bạn không thông thạo bằng c, hãy đọc mã hạt nhân. –

Trả lời

20

Dấu (for;;) là một điều kiện vòng lặp vô hạn, tương tự như trong khi (1) như phần lớn đã đề cập. Bạn sẽ thường xuyên thấy điều này, trong các mã mutex kernel, hoặc mutex ví dụ như các vấn đề như các nhà triết học ăn uống. Cho đến khi biến mutex được đặt thành một giá trị cụ thể, chẳng hạn như quy trình thứ hai được truy cập vào tài nguyên, quy trình thứ hai tiếp tục lặp lại, còn được gọi là chờ đợi bận. Truy cập vào một tài nguyên có thể được truy cập đĩa, mà trong đó 2 quá trình đang cạnh tranh để đạt được quyền truy cập bằng cách sử dụng một mutex như vậy tại một thời điểm chỉ có một quá trình có quyền truy cập vào tài nguyên.

+1

Vòng lặp vô hạn và chờ đợi bận rộn là những thứ khác nhau. Một chờ đợi bận rộn là một vòng lặp * không ngủ chờ đợi một số điều kiện - không có gì vô hạn về nó. –

+2

@Jim, để công bằng, không có vòng lặp là vô hạn như bạn có thể mất quyền lực bất cứ lúc nào hoặc máy tính của bạn sẽ chết vì tuổi già. Anh ấy đang nói nhiều hơn về việc yêu cầu trình biên dịch cho một vòng lặp không có điều kiện kết thúc hơn là một cái gì đó vô hạn. – Blindy

+1

@Blindy Cách để bỏ lỡ điểm và lố bịch ngớ ngẩn cùng một lúc. Giống như duh, tôi không biết về cái chết nhiệt của vũ trụ. Trong khi đó, * bận rộn * chờ đợi, như tôi đã nói, không ngủ, * và * có điều kiện kết thúc. –

46

Nghĩa đen là "không làm gì cả, cho đến khi không có gì xảy ra và ở mỗi bước, không phải làm gì để chuẩn bị cho lần tiếp theo". Về cơ bản, đó là một vòng lặp vô hạn mà bạn sẽ phải phá vỡ bằng cách nào đó bằng cách sử dụng câu lệnh break, return hoặc goto. .

+1

Thumbs up cho tốc độ :) – Anna

5

Nó lặp mãi mãi (cho đến khi mã bên trong vòng lặp gọi break hoặc return, tất nhiên while(1) là tương đương, cá nhân tôi thấy nó logic hơn để sử dụng mà

+1

Hoặc gọi thoát hoặc longjmp hoặc làm một goto ra khỏi vòng lặp, hoặc (POSIX) cho đến khi một tín hiệu xảy ra mà không trở lại. Ngoài ra các loại hành vi không xác định khác nhau có thể chấm dứt vòng lặp, cũng như các sự kiện bên ngoài khác nhau ngoài phạm vi của ngôn ngữ C, bao gồm thả một nuke trên máy tính mà chương trình đang chạy. –

4

Đó là tương đương với while(true)

Chỉnh sửa.: Vì đã có một số cuộc tranh luận gây ra bởi câu trả lời của tôi, nên làm rõ rằng điều này không hoàn toàn chính xác đối với các chương trình C không được viết cho C99 và hơn thế nữa trong đó stdbool.h đã đặt giá trị true = 1.

+4

miễn là đúng == 1. –

+12

Họ cần có hệ thống giảm giá bình luận. – Blindy

+1

Hey người đàn ông, anh ta chỉ cố gắng để đảm bảo mọi người trong tương lai chứng minh các ứng dụng của họ chống lại khả năng của giá trị của 'đúng' thay đổi. –

2

nó là một fo vô hạn r vòng lặp.

9

Đây là vòng lặp vô hạn không có điều kiện ban đầu, không có điều kiện tăng và không có điều kiện kết thúc. Vì vậy, nó sẽ lặp lại mãi mãi tương đương với trong khi (1).

+4

ít nhất một trình biên dịch tôi biết sẽ cảnh báo về các vòng lặp (1) hoặc trong khi (đúng), nhưng "biết" để không tạo ra chẩn đoán cho (;;) vì nó được coi là dạng "chuẩn" cho vòng lặp vô hạn. –

2

Cũng giống như viết vòng lặp vô hạn bằng cách sử dụng câu lệnh "for" nhưng bạn phải sử dụng ngắt hoặc một số câu lệnh khác có thể thoát khỏi vòng lặp này.

1

tôi có nghĩa là:

#define EVER ;; 

for(EVER) 
{ 
    // do something 
} 

Cảnh báo: Sử dụng điều này trong mã của bạn được đánh giá cao khuyến khích.

+6

Tôi thực sự ghét nó khi tôi thấy mã như thế này. Tác giả rõ ràng nghĩ rằng anh ta rõ ràng hơn nhưng tôi thường phải quay lại và chắc chắn rằng EVER không được định nghĩa là cái gì đó xấu sẽ gây ra vấn đề cho tôi. – Fredrik

+0

Đúng, tôi cũng không viết cho (EVER) trong mã của tôi. Điều này chỉ là cho vui :) – JCasso

+0

Thật vậy, không làm điều này trong mã thực. – Ree

0

Đó rõ ràng là điều kiện vòng lặp vô hạn.

0

Đó là vòng lặp vô hạn mà bạn sẽ phải phá vỡ bằng cách nào đó bằng cách sử dụng lệnh ngắt, trả lại hoặc goto. hoặc một trong hai số ngắt xảy ra trường hợp vòng lặp này sẽ chạy vô hạn và thực thi; (tuyên bố null) mỗi khi

1

for (;;)

là một vòng lặp vô hạn giống như while(1). Ở đây không có điều kiện được cho rằng sẽ chấm dứt vòng lặp. Nếu bạn không phá vỡ nó bằng cách sử dụng tuyên bố break vòng lặp này sẽ không bao giờ chấm dứt.

1

Nó có chức năng tương đương với while(true) { }.

Lý do tại sao cú pháp for(;;) đôi khi được ưu tiên xuất phát từ một độ tuổi lớn hơn nơi for(;;) thực sự được biên dịch thành mã máy nhanh hơn một chút so với while(TRUE) {}. Điều này là do for(;;) { foo(); } sẽ dịch ở đèo đầu tiên của trình biên dịch để:

lbl_while_condition: 
    mov $t1, 1 
    cmp $t1, 0 
    jnz _exit_while 
lbl_block: 
    call _foo 
    jmp lbl_while_condition 

trong khi for(;;) sẽ biên dịch tại đèo đầu tiên:

lbl_for_init: 
    ; do nothing 
lbl_for_condition: 
    ; always 
lbl_for_block: 
    call foo; 
lbl_for_iterate: 
    ; no iterate 
    jmp lbl_for_condition 

tức

lbl_for_ever: 
    call foo 
    jmp lbl_for_ever 

Do đó tiết kiệm 3 hướng dẫn trên mỗi đường chuyền của vòng lặp.

Trong thực tế tuy nhiên, cả hai câu lệnh đã từ lâu được không chỉ chức năng tương đương, mà còn thực sự tương đương, vì optimisations trong trình biên dịch cho tất cả xây dựng khác hơn debug xây dựng sẽ đảm bảo rằng các mov, cmpjnz được tối ưu hóa đi trong while(1) trường hợp, dẫn đến mã tối ưu cho cả hai for(;;)while(1).

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