Tôi đang làm việc trên một dự án và cố gắng sử dụng pthread_cond_wait()
và pthread_cond_signal()
để đồng bộ hóa hai luồng.Tín hiệu có điều kiện Pthread - không hoạt động như mong đợi
Mã của tôi trông giống như sau:
pthread_mutex_t lock_it = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t write_it = PTHREAD_COND_INITIALIZER;
int main(int argc, char**argv)
{
pthread_t t_send_segments, t_recv_acks;
pthread_create(&t_send_segments, NULL, send_segments, (void*)NULL);
pthread_create(&t_recv_acks, NULL, recv_acks, (void*)NULL);
pthread_join(t_recv_acks, (void**)NULL);
pthread_mutex_destroy(&lock_it);
pthread_cond_destroy(&write_it);
}
void* send_segments(void *v) {
for(;;) {
pthread_mutex_lock(&lock_it);
printf("s1\n");
printf("s2\n");
pthread_cond_wait(&write_it, &lock_it);
printf("s3\n");
printf("s4\n");
printf("s5\n");
pthread_mutex_unlock(&lock_it);
}
return 0;
}
void* recv_acks(void *v) {
for(;;) {
pthread_mutex_lock(&lock_it);
printf("r1\n");
pthread_cond_signal(&write_it);
printf("r2\n");
pthread_mutex_unlock(&lock_it);
}
return 0;
}
Sản lượng dự kiến là:
s1
s2
r1
s3
s4
s5
s1
s2
r2
r1
s3
s4
s5
(etc)
sản lượng của tôi không làm theo mô hình này ở tất cả. Rõ ràng là tôi có lỗi logic ở đâu đó, nhưng tôi không hiểu đâu. Tại sao sản phẩm recv_acks()
chỉ có hiệu suất là khi nó chạm vào số pthread_cond_signal()
- vì pthread_cond_wait()
luôn thực hiện trước tiên (vì thứ tự mà tôi tạo chủ đề) và cond_wait()
luôn thực thi vì nó nằm trong phần quan trọng?
đầu ra của bạn trông như thế nào? – Hasturkun
"luôn luôn thực hiện đầu tiên (vì thứ tự mà tôi tạo ra các chủ đề" - dựa vào điều này có thể khá nguy hiểm. Hãy tắt mutex trước khi bắt đầu chủ đề và chuyển quyền sở hữu cho người gửi. – Dipstick