2009-10-22 40 views
19

Tôi đang phát triển một ứng dụng mà tôi thực hiện đa luồng. Một trong các chuỗi công việc của tôi hiển thị hình ảnh trên tiện ích. Một luồng khác phát âm thanh. Tôi muốn dừng/tạm dừng/tạm dừng/ngủ các chủ đề trên một sự kiện bấm nút. Nó giống như khi chúng ta nhấp vào nút phát/tạm dừng trình phát video. Tôi đang phát triển ứng dụng của mình trong c + + trên nền tảng Linux bằng cách sử dụng thư viện pthread cho luồng.Cách ngủ hoặc tạm dừng PThread trong c trên Linux

Ai đó có thể cho tôi biết cách tôi đạt được chủ đề tạm dừng/tạm ngừng không?

Trả lời

29

Bạn có thể sử dụng biến mutex, biến điều kiện và biến cờ được chia sẻ để thực hiện việc này. Giả sử chúng được định nghĩa toàn cầu:

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 
pthread_cond_t cond = PTHREAD_COND_INITIALIZER; 
int play = 0; 

Bạn có thể cấu trúc mã phát lại của bạn như thế này:

for(;;) { /* Playback loop */ 
    pthread_mutex_lock(&lock); 
    while(!play) { /* We're paused */ 
     pthread_cond_wait(&cond, &lock); /* Wait for play signal */ 
    } 
    pthread_mutex_unlock(&lock); 
    /* Continue playback */ 
} 

Sau đó, để chơi, bạn có thể làm điều này:

pthread_mutex_lock(&lock); 
play = 1; 
pthread_cond_signal(&cond); 
pthread_mutex_unlock(&lock); 

Và để tạm dừng:

pthread_mutex_lock(&lock); 
play = 0; 
pthread_mutex_unlock(&lock); 
+0

Không thực sự an toàn khi truy cập vào biến được chia sẻ trên toàn cầu trong môi trường đa luồng. Khóa mutex trước khi kiểm tra '! Play' và cũng sử dụng mutex khi đặt' play = 0; '. Trong thực tế, điều này sẽ không phải là một vấn đề trên một hệ thống lõi đơn lẻ nhưng tốt hơn là viết mã đúng/tương lai. –

+0

Trong thực tế, nó sẽ không phải là một vấn đề đối với hầu hết các hệ thống đa lõi, mặc dù bạn đã đúng — điều này cần ít nhất một vài rào cản bộ nhớ. Không có chúng, việc tạm dừng có thể mất một thời gian dài tùy ý để có hiệu lực. Tất nhiên, chỉ cần khóa các mutex là tốt quá, và tôi sẽ chỉnh sửa câu trả lời này để làm điều đó. :) – LnxPrgr3

+0

@deft_code Đã cập nhật câu trả lời! Xin vui lòng xem bình luận trước đó của tôi mặc dù. – LnxPrgr3

3

Bạn có cuộc thăm dò chủ đề của mình cho "thư" từ giao diện người dùng theo khoảng thời gian thông thường. Nói cách khác, giao diện người dùng trong một chuỗi đăng thông điệp hành động lên chuỗi công việc, ví dụ: âm thanh/video.

+2

Đây có lẽ là câu trả lời hay nhất tại đây. Vấn đề là nó rất mỏng về chi tiết mà nó không thực sự trả lời câu hỏi. –

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