Tôi đang chạy một chương trình socket đa luồng với valgrind. Máy khách sẽ gửi yêu cầu tới máy chủ qua TCP, và sau đó bận chờ một boolean. Boolean sẽ được thiết lập khi hàm gọi lại phục vụ phản hồi từ máy chủ được gọi. Sau khi nhận được phản hồi (và cờ boolean được thiết lập), máy chủ sẽ gửi lại một yêu cầu và lặp lại thao tác này lặp lại trong một vòng lặp.valgrind quầy hàng trong chương trình socket đa luồng
Tôi nhận ra rằng truy cập không được quản lý đối với biến được chia sẻ (boolean) có thể gây ra sự cố luồng, nhưng tôi đã thử sử dụng mutexes pthread, và chương trình làm chậm khoảng 20% (tốc độ là tầm quan trọng ở đây). Tôi tin rằng việc ghi vào biến boolean được chia sẻ là tốt vì nó có thể được thực hiện trong một chu kỳ đơn.
Chương trình chạy tốt bên ngoài valgrind, nhưng thường sẽ dừng khi chạy với valgrind. Tôi rời khỏi chương trình để chạy qua đêm .. thường mất một vài giây để hoàn thành, vì vậy tôi không nghĩ rằng đó là một trường hợp không chờ đợi đủ lâu để chương trình kết thúc. Luồng được quản lý bởi khung công cụ nguồn mở (sửa lỗi nhanh), vì vậy tôi không nghĩ rằng đó là vấn đề với cách tạo luồng/quản lý luồng.
Có ai biết về bất kỳ vấn đề nào với việc đo lường xung quanh các chương trình đa luồng/vòng lặp chờ đợi bận/liên lạc ổ cắm (hoặc kết hợp các kết nối này) không?
bận chờ đợi trên biến boolean chia sẻ không được thực hiện trong một chu kỳ đơn, nó được thực hiện trong một vài chu kỳ trên mỗi vòng lặp và nếu vòng lặp bận của bạn đang đợi trên một chuyến đi vòng qua mạng TCP, thì vòng lặp có khả năng sẽ lặp lại vài tỷ lần (và do đó lãng phí vài tỷ chu kỳ CPU có thể được sử dụng tốt hơn ở nơi khác). Một giải pháp tốt hơn so với một trong những điều bạn đã đề cập là chờ một biến điều kiện và có chức năng gọi lại báo hiệu biến điều kiện để đánh thức luồng của bạn khi dữ liệu sẵn sàng. –
Tôi đã nói rằng việc ghi vào biến boolean được thực hiện trong một chu kỳ đơn (không phải toàn bộ quá trình đợi bận). Có nói rằng tôi nên nói rằng việc ghi vào biến boolean được thực hiện một cách nguyên tử (như bộ nhớ cache bị xóa vv có thể đẩy một ghi một byte đơn qua một chu kỳ CPU đơn) – Taras
Điều Jeremy nói - chờ đợi bận là một ý tưởng tồi, biến điều kiện là tốt hơn, và không thể chậm hơn ... – BillT