2009-05-17 6 views
5

Nếu tôi có một pthread_barrier_t được khởi tạo, khi nào thì an toàn để tiêu diệt nó? Ví dụ sau có an toàn không?Khi nào an toàn để phá hủy một rào cản pthread?

pthread_barrier_t barrier; 
... 
int rc = pthread_barrier_wait(b); 
if (rc != PTHREAD_BARRIER_SERIAL_THREAD && rc != 0){ 
    perror("pthread_barrier_wait"); 
    exit(1); 
} 

if (id == 0){ 
    if(pthread_barrier_destroy(&(threads[t_root].info.tmp_barrier))){ 
    perror("pthread_barrier_destroy"); 
    exit(1); 
    } 
} 

Trả lời

5

Sau khi pthread_barrier_wait() trả về, tất cả chủ đề sẽ gặp phải rào cản và đang tiếp tục. Vì chỉ có một thread được đưa ra giá trị PTHREAD_BARRIER_SERIAL_THREAD Đổi lại, nó là an toàn để sử dụng có điều kiện quấn mã hủy diệt như vậy:

int rc = pthread_barrier_wait(&b) 
if (rc == PTHREAD_BARRIER_SERIAL_THREAD) 
{ 
    pthread_barrier_destroy(&b); 
} 

Ngoài ra, lưu ý rằng pthread_barrier_destroy() sẽ trả lại kết quả của EBUSY nếu rào cản đã được sử dụng (tức là một sợi khác đã được gọi là pthread_barrier_wait()).

+4

Câu cuối cùng của câu trả lời là sai. Mỗi POSIX, đó là UB: "Các kết quả không xác định nếu pthread_barrier_destroy() được gọi khi bất kỳ luồng nào bị chặn trên hàng rào, hoặc nếu hàm này được gọi với một rào chắn chưa được khởi tạo." (http://pubs.opengroup.org/onlinepubs/9699919799/functions/pthread_barrier_destroy.html) –